采用int数组存储每一位,模拟乘法操作,逐位相乘,往前进位。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> /*** 函数:计算i!的值 **/ void Cal(int i,int big[50]) { int j,up,res,m; int ge,shi;//乘数的个位,十位 int big1[50],big2[50]; if(i==1) { big[0]=1; } else if(i<=9) { j=0; up=0; while(big[j]!=-1) { res = big[j]*i+up; big[j] = res%10; up = res/10; j++; } if(up!=0) big[j] = up; } else { ge = i%10; shi = i/10; //*****计算被乘数与十位数的乘积,存到big1[50]里 for(m=0;m<50;m++) { big1[m]=big[m];//十位数字的乘积 } j=0; up=0; while(big1[j]!=-1) { res = big1[j]*shi+up; big1[j] = res%10; up = res/10; j++; } if(up!=0) big1[j] = up; while(big1[j]==-1) j--; while(j>=0) { big1[j+1]=big1[j]; j--; } big1[0]=0; //*****计算被乘数与个位数的乘积 if(ge!=0)//个位数不为零 { for(m=0;m<50;m++) { big2[m]=big[m];//big2[50]存放个位数字的乘积 } j=0; up=0; while(big2[j]!=-1) { res = big2[j]*ge+up; big2[j] = res%10; up = res/10; j++; } if(up!=0) big2[j] = up; //将big1[50]与big2[50]逐位相加 up=0; for(m=0;m<50;m++) { if(big1[m]!=-1 && big2[m]!=-1)//都没到最高位 { big[m]=(big1[m]+big2[m]+up)%10; up = (big1[m]+big2[m]+up)/10; } else if(big1[m]==-1 && big2[m]==-1)//都是还未使用的位 { if(up!=0) { big[m]=up; up = 0; } else big[m]=-1; } else if(big1[m]!=-1 && big2[m]==-1)//一个是最高位,一个不是 { big[m]=(big1[m]+0+up)%10; up = (big1[m]+0+up)/10; } } } else//个位数为零,直接将big1[50]赋给原数组 { for(m=0;m<50;m++) { big[m]=big1[m]; } } } } int main() { int big[50],i,j; for(i=0;i<50;i++) { big[i]=-1; } for(i=1;i<=40;i++) { Cal(i,big); printf("%d!=",i); j=0; while(big[j]!=-1) { j++; } j--; while(j>=0){ printf("%d",big[j]); j--; } printf("\n"); } return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。