永发信息网

C语言,实现不会溢出的阶乘计算

答案:5  悬赏:40  手机版
解决时间 2021-01-28 13:38
C语言,实现不会溢出的阶乘计算,不要只讲思路,最好有源代码,谢谢啦
最佳答案
当然是用数组解决了 #include
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;
}
全部回答
此题的正确答案应该是“不可能”!因为即使用数组,数组的长度在计算机中也不是无止境的。所以,在没有上限限制的情况下“不会溢出”是无法实现的!

#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; }

比如你用一个: unsigned int ??ret; 来接收计算后的值。 可以用个循环计算阶乘。当要溢出的时候就停止阶乘,判断是否溢出可以使用:if ( ( ( unsigned long long int )( ret ) + XXXX ) >= 0xffffffff )
我的方法大致和redfox老兄是一样的,他注释比较全,分给他吧// kkkk.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include #include #define MAXN 1000void pnext(int a[],int k) { int *b,m=a[0],i,j,r,carry; b=(int*)malloc(sizeof(int)*(m+1)); for(i=1;i<=m;i++) b[i]=a[i]; for(j=1;j
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯