大数求阶乘(防溢出)
一.递归在没遇到大数求阶乘前,一直都用递归,如果是1的阶乘,则返回1,其他的都返回n-1的阶乘与n的积,循环调用即可。但只针对数字较小的案例,一旦数字过大,便会溢出。若定义成long,long的长度为四个字节即32位,2^32=4.3X10^9. 二.字符数组这种方法是直接乘法运算的储存,个位大于9,便进位到十位,依次类推,若个位,十位,百位.....都存有数,则当乘一个数时,每位数都与该数相乘,一旦大于等于十便进位(要先从个位开始进位)。 举例int data[10000]; 3!= 1 * 2 * 3 =6;(6) 4!= 1 * 2 * 3* 4 = 6 * 4 = 24(24) 5!= 4!* 5; (20 10) for(j=1;j<=digit;j++) { if(data[j]>=10) { for(r=1;r<=digit;r++) { if(data[digit]>9) digit++; data[r+1]+=data[r]/10; data[r]=data[r]%10; } } } 则存放在数组里应是 (0 2 1); ..................... 以此类推,最后逆序输出 代码#include <iostream> #include <stdio.h> #include <cstring> using namespace std; int main() { int data[10000]; int digit; int i,j,k,r; int n; memset(data,sizeof(data)); data[0]=1; data[1]=1; digit=1; cin>>n; for(i=1;i<=n;i++) { for(j=1;j<=digit;j++) data[j]*=i; for(j=1;j<=digit;j++) { if(data[j]>10) { for(r=1;r<=digit;r++) { if(data[digit]>9) digit++; data[r+1]+=data[r]/10; data[r]=data[r]%10; } } } } printf("%d!=",n); for(k=digit;k>0;k--) cout<<data[k]; return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |