大数的存储问题,计算1~40所有数的阶乘
发布时间:2020-12-14 01:58:59 所属栏目:大数据 来源:网络整理
导读:采用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[
采用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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |