C语言,实现不会溢出的阶乘计算
- 提问者网友:嗝是迷路的屁
- 2021-01-27 18:40
- 五星知识达人网友:西岸风
- 2021-01-27 19:14
int a[200]; //确保保存最终运算结果的数组足够大
main()
{
int n; //阶乘大小
int i,j;
int carry; //进位
int digit = 1; //位数
int temp; //阶乘的任一元素与临时结果的某位的乘积结果
printf("请输入n的大小:");
scanf("%d",&n);//从键盘接收阶乘大小
a[0] = 1; //将结果先初始化为1
for( i = 2; i <= n; ++i) //开始阶乘,阶乘元素从2开始依次“登场”
{
//按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
for( j = 1, carry = 0; j <= digit; ++j)
{
temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
a[j-1] = temp % 10; //更新临时结果的位上信息
carry = temp / 10; //看是否有进位
}
while(carry) //如果有进位
{
a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1
carry /= 10; //看还能不能进位
}
}
printf("结果是:\n%d ! = ",n); //显示结果
for( i = digit; i >=1; --i)
{
printf("%d",a[i-1]);
}
return 0;
}
- 1楼网友:第四晚心情
- 2021-01-27 21:49
- 2楼网友:笑迎怀羞
- 2021-01-27 21:26
#include<stdio.h> #include<string.h>
#define max 10000//乘积的最大长度
void solve(char str[],int n,char key[]) { int e,d; int i,j,k; int p; int len; len=strlen(str); for(i=0;i<max;i++) key[i]='0';
j=0; do { p=n%10; n=n/10;
e=0; for(k=0,i=len-1;i>=0;i--,k++) { d=(str[i]-'0')*p+key[k+j]-'0'+e; e=d/10; key[k+j]=d%10+'0'; } while(e) { d=key[k+j]-'0'+e; e=d/10; key[k+j]=d%10+'0'; k++; } j++;
}while(n);
for(i=max-1;i>=0;i--) { if(key[i]!='0') break; }
for(j=0;j<=i;j++) str[j]=key[i-j]; str[j]=0; strcpy(key,str);
}
int main() { char str[max],key[max]; int n; int i; while(scanf("%d",&n)) { str[0]='1'; str[1]=0;
for(i=1;i<=n;i++) { solve(str,i,key); strcpy(str,key); } printf("%s\n",key); } return 0; }
- 3楼网友:神也偏爱
- 2021-01-27 21:14
- 4楼网友:醉吻情书
- 2021-01-27 20:32