为什么我这个求阶乘和 n>12答案就是错的,c语言编程
发布网友
发布时间:2024-10-05 22:49
我来回答
共3个回答
热心网友
时间:2024-12-01 23:30
一般21的阶乘就超过long long(2^64-1)的精度范围了
再大的数据就只能用高精度运算了(数组存数位,模拟四则运算)
#include<stdio.h>
#define max(x,y) x>y?x:y
#define N 10000
int a[N];//记录一个数的阶乘
int s[N]={0};//记录1~n的阶乘和 (数组s置0,累加)
int fun(int n)
{//1~n的大数阶乘
int count=1,f,t;
a[0]=1;
for(int i=1;i<=n;i++)
{
f=0; //记录进位数
for(int j=0;j<count;j++) //每一位数乘i
{
t=a[j]*i+f; //temp记录每一位数乘i加上进位之后的数
a[j]=t%10; //A[j]存储一个不超过10的数
f=t/10; //记录应进位数
}
while(f) //位数增加的进位
{
a[count]=f%10;
f=f/10;
count++;
}
}
return count;//返回当前阶乘的数位长度
}
void fun1(int len)
{//大数相加
int t=0;
for(int i=0;i<len;i++)
{
t=t+s[i]+a[i];
s[i]=t%10;
t/=10;
}
if(t!=0)//进位
s[len]=t;
//memset(a,0,sizeof(a));
}//每次函数fun1调用后a数组不用置0,
//因为i+1一定不i的阶乘大,数位也比i的阶乘数位长;
//i+1的阶乘会将i的阶乘的数位覆盖
int main()
{
int n,len=0;
scanf("%d",&n);//求n的阶乘和
for(int i=1;i<=n;i++)
{
len=max(len,fun(i));//全局数组a保存着i!的数位
fun1(len);//大数累加
}
for(int i=len-1;i>=0;i--)//逆序输出
printf("%d",s[i]);
return 0;
}
热心网友
时间:2024-12-01 23:30
阶乘数据长得太快了,而int的数据太小了,最大就65535,超过这个范围就溢出了。就算换成long类型的也大不了多少,只要n在10以内是正确的就可以了。
热心网友
时间:2024-12-01 23:31
非常正常
你这个int是4字节
大于 12,结果就超过了!
溢出了追问那怎么处理啊
追答可以用别的 更大的 数据类型
取决于你所用的 c 编译系统