如果使用普通的方法,当阶乘计算到13!时数据就开始出现问题,因为int型数据无法保存这么大的数字,即使换成long ,long long ,double等也无法容纳,所以我们需要使用大数的方法来完成这道题目。
所谓大数就是将一个极大的数值拆分开来,每一位的数字都作为数组的一个元素保存起来,下面我将一步一步讲解这个代码如何实现
首先声明变量 a用于储存大数,数组大小可以赋予任意较大值,足够保存即可
int jw,w=1,t,a[5000],i,j,z;
a[0] = 1 ;
// Jw为进位 W为位数 a为大数储存 t储存临时数据
我们可以将大数的每一位分别与一个数字相乘,得到一个临时数据,对该数据取余保留当前项,进位加到下一项,即可得到每一位的数值
for(j=1,jw=0; j<=w; j++){
t = a[j-1] * i + jw; // 使被拆分为数组的大数的每一项与 i 相乘并且加上进位
a[j-1] = t % 10; // 将余数存到当前项中
w = t / 10; //取进位
}
while( jw ){
a[++w-1] = jw % 10;
jw /= 10;
}
例子:
数据 9 *11
a[0] =9;
t = a[0]*9;
a[0] = t%10 = 9
a[1] = t/10 =9
当存在进位的时候,位数增加,并将进位%10后进到下一位中,若进位大于十,则循环一直往后加。
for(z = w; z>=1; z--){
printf("%d",a[z-1]);
}
因为大数的数据在数组中为逆序排序,所以只需倒序遍历输出数组即可得到答案
完整代码:
#include
int main()
{
int jw,w=1,t,a[5000];
int i,j,z;
// Jw为进位 W为位数 a为大数储存 T储存临时数据
a[0] = 1;
for(i=1; i<=50; i++){
for(j=1,jw=0; j<=w; j++){
t = a[j-1] * i + jw; // 使被拆分为数组的大数的每一项与 i 相乘并且加上进位
a[j-1] = t % 10; // 将余数存到当前项中
jw = t / 10; //取进位
}
while( jw ){
a[++w-1] = jw % 10;
jw /= 10;
}
//当有进位的时候将进位给到下一项
for(z = w; z>=1; z--){
printf("%d",a[z-1]);
}
printf("\n");
}
return 0;
}