user-0 提问: [求助]杨辉三角形第十五行之后输出错误

回复:
user: user-1
content: 看得出来，代码使用的计算方法是用 阶乘 的办法来计算杨辉三角的各行数字。阶乘带来的问题是，中间计算过程中的数值 「 更容易」 会超出整型数据类型的取值范围，而导致被截断引起失准。 在for循环中添加了一行打印行数的语句，在 64位 系统上实测第 22 行开始出现数据错误。  for (i = 0; i < n; i++) { 		                 // 打印行数                 printf("Line %ld: ", i+1);  		p = n - 1 - i; 		while (p > 0) { 			printf(" "); 			p--; 		} 		for (j = 0; j <= i; j++) { 			s = fac(i) / (fac(i - j) * fac(j)); 			printf("%ld ", s); 		} 		printf("\n"); 	}  改进措施的话，图省事就把数据类型改大一点，输出行数改小一点。或者，把算法从 利用阶乘 改成利用上一行的左右两个数相加 ，这样的话，数值超出数据类型的取值范围会 慢得多。 最彻底的办法就是按字符来处理每一位数字，自行设计算法避免出现数值溢出了。 ～

user: user-2
content: 你在fac函数里用了阶乘，但是long这个数据类型不够大，运行到后面就溢出了，把fac这个函数的返回值改成long long，把变量s的数据类型也改成long long可以暂时解决这个问题（当然如果阶乘过大还是会出现这个问题）

user: user-3
content: 仅供参考：//按如下格式打印杨辉三角形的前MAXN行。 //  1 //  1 1 //  1 2 1 //  1 3 3 1 //  1 4 6 4 1 //  1 5 10 10 5 1 #include <stdio.h> #define MAXN 68 unsigned __int64 y[MAXN][MAXN]; int i,j; void main() {     printf("1\n");     printf("1 1\n");     y[1][0]=1ui64;y[1][1]=1ui64;     for (i=2;i<MAXN;i++) {         y[i][0]=1ui64;printf("1 ");         for (j=1;j<=i-1;j++) {             y[i][j]=y[i-1][j-1]+y[i-1][j];             printf("%I64u ",y[i][j]);         }         y[i][i]=1ui64;printf("1\n");     } } //1 //1 1 //1 2 1 //1 3 3 1 //1 4 6 4 1 //1 5 10 10 5 1 //1 6 15 20 15 6 1 //1 7 21 35 35 21 7 1 //1 8 28 56 70 56 28 8 1 //1 9 36 84 126 126 84 36 9 1 //... //1 67 2211 47905 766480 9657648 99795696 869648208 6522361560 42757703560 247994680648 1285063345176 5996962277488 25371763481680 97862516286480 345780890878896 1123787895356412 3371363686069236 9364899127970100 24151581961607100 57963796707857040 129728497393775280 271250494550621040 530707489338171600 972963730453314600 1673497616379701112 2703342303382594104 4105075349580976232 5864393356544251760 7886597962249166160 9989690752182277136 11923179284862717872 13413576695470557606 14226520737620288370 14226520737620288370 13413576695470557606 11923179284862717872 9989690752182277136 7886597962249166160 5864393356544251760 4105075349580976232 2703342303382594104 1673497616379701112 972963730453314600 530707489338171600 271250494550621040 129728497393775280 57963796707857040 24151581961607100 9364899127970100 3371363686069236 1123787895356412 345780890878896 97862516286480 25371763481680 5996962277488 1285063345176 247994680648 42757703560 6522361560 869648208 99795696 9657648 766480 47905 2211 67 1

user: user-4
content: 没看出有啥错误，贴出你的输出错误的结果

user: user-5
content: 首先，你这个程序逻辑没有问题，之所以出现你说的问题，是因为你没有考虑到数据溢出的问题。这个是很多学者会忽略的问题，这里科普一下以下知识点： 1、在这里要说明一下，一般情况下整数的类型不建议用long型，因为long型在32位系统是占4字节，而在64位系统是占8字节，因此，long型数据范围不确定。为了避免系统原因，对于整型我们一般用int和long long 型； 2、int型不超过10的9次方，long long型不超过10的18次方。因为你用的是计算阶乘的方式，而我们知道阶乘得到的数据特别大，当超过12的时候，就会超过int型范围。因此，这里使用long long型； 3、你的程序中把所有的变量都定义为了long型，这种一般不建议这么做。一般情况下我们只对需要设置其他数据类型的变量进行设置。比如程序中只需要把存储计算结果的变量设置为long long型，其他的设置为int型即可！！！具体在以下的程序中有标注！还有什么问题可以再问哦！，附上修改后的程序：   #include<stdio.h> long long fac(int x) {//得到的结果也是long long型  	long long s; 	if(x==0) 		s=1; 	else 		s=x*fac(x-1); 	return s; }  int main() { 	int n,i,j,p;//设置为int即可  	long long s;//设置为long long型  	scanf("%d",&n); 	for(i=0; i<n; i++) { 		p=n-1-i; 		while(p>0) { 			printf(" "); 			p--; 		} 		for(j=0; j<=i; j++) { 			s=fac(i)/(fac(i-j)*fac(j)); 			printf("%lld ",s);//结果为long long类型  		} 		printf("\n"); 	} 	return 0; }