|
用数组的方法解决大数、巨数的阶乘结果越界的问题。(不过这里的代码超出了C99标准。)
Severity Description Resource In Folder Location Creation Time 2 `for' loop initial declaration used outside C99 mode jc.c jiecheng line 19 2005年9月5日 12:41:44
具体算法中有最朴实的乘法运算思想,请各位细细体味。
#include
int main() { int n; //阶乘大小 printf("请输入n的大小:"); scanf("%d",&n); //从键盘接收阶乘大小 int a[200]; //确保保存最终运算结果的数组足够大 int carry; //进位 int digit = 1; //位数 a[0] = 1; //将结果先初始化为1 int temp; //阶乘的任一元素与临时结果的某位的乘积结果 for(int i = 2; i <= n; ++i) //开始阶乘,阶乘元素从2开始依次“登场” { //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘 for(int 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(int i = digit; i >=1; --i) { printf("%d",a[i-1]); } return 0; }
请输入n的大小:结果是: 100 ! = 93326215443944152681699238856266700490715968264381621468592963895217 5999932299156089414639761565182862536979208272237582511852109168640000000000 00000000000000
|