1、大数运算高精度的部分运算高精度的部分运算 0源代码 1int Judge(char ch) 1int Compare(char a,char b) 1void BigNumberAdd(char a1,char b1) 2void BigNumberSub(char a1,char b1) 2void BigNumMultiSmall(char a1,int b1) 4void BigNumMultiBig(char a1,char b1) 5void BigNumFact(int x) 5void BigNumFactAdd(int t) 6void BigNumInvol(char a1,
2、int b1) 6int BigNumDividSmall(char a1,int b1) 7void BigNumDividBig(char a1,char b1) 8int main() 9代码效果展示 12源代码#include#includechar c2000;/全局变量,存储大数运算的结果char arr1000;/高精度除以高精度的余数long z=0;/高精度除以低精度的余数int Judge(char ch)/判断字符串ch是否全为,若全为,返回,否则返回 int i,k; k=strlen(ch); for(i=0;ik;i+) if(chi!=0) return 0; r
3、eturn 1;int Compare(char a,char b)/比较字符串的大小,方法不同于strcmp函数,类似于整型常量的比较 int lena,lenb,i; lena=strlen(a); lenb=strlen(b); if(lenalenb) return 1; else if(strcmp(a,b)=0) return 0; else for(i=0;ibi) return 1; if(aibi) return -1; return 0; /*算法:先确定a和b中的最大位数k,然后依照由低至高位的顺序进行加法运算。注意进位,若高位有进位,则c的长度为k+1。*/高精度加法v
4、oid BigNumberAdd(char a1,char b1) int i,j,k,lena,lenb; int a1000=0,b1000=0,d1000=0; lena=strlen(a1); lenb=strlen(b1); /将加数与被加数化为整型数组,并且该数组的其他位为0 for(i=0;ilena;i+) ai=a1lena-i-1-0; for(i=0;ilenb?lena:lenb; for(i=0;ik;i+) di=ai+bi+di; di+1=di+1+di/10; di=di%10; /若高位进 while(dk) k+; while(!dk-1) k-;/001
5、+0003=4 /将整型数组逆着转变并赋值给c字符型数组 for(j=0;j=0) /若被减数大于等于减数 for(i=0;ilena;i+) ai=a1lena-1-i-0; for(i=0;ilenb;i+) bi=b1lenb-1-i-0; flag=0;/结果正的标志 else /若被减数小于减数 for(i=0;ilenb;i+) ai=b1lenb-1-i-0; for(i=0;ilenb?lena:lenb; for(i=0;ik;i+) /大数减小数 if(aibi) /若被减数不够减,向高位借一位 ai+1-; di=ai-bi+10; else di=ai-bi; /若较高
6、位已为,并且不止位时 while(!di-1) k-; i-; /根据flag,输出有无- if(!flag) for(i=0;ik;i+) /将结果转化为字符逆着赋给数组c if(!i&!dk-i-1)/若差的第一个字母为,则马上跳过 continue; ci=dk-i-1+0; else c0=-; for(i=1;i=k;i+) /将结果转化为字符逆着赋给数组c if(i=1&!dk-i)/若差的第一个字母为,则马上跳过 continue; ci=dk-i+0;/注意d的下标,不是k-i-1 if(Judge(c)/若差全为,则只输出一个 strcpy(c,0);/*算法:将多位数存入数
7、组,低位在前、高位在后,然后用一位数去乘数组的各位,考虑进位,最后按正常顺序输出*/高精度乘法-高精度乘以低精度void BigNumMultiSmall(char a1,int b1) int i,j,t; int a2000=0; /将字符串转化为整型数组,并逆置 t=strlen(a1); for(i=0;it;i+) ai=a1t-1-i-0; /整型数组的每个元素乘以b1,然后对其进行求余,整除,使其只有一位数 a0=a0*b1; for(i=1;i9) /若最后一个元素大于 ai=ai-1/10; ai-1=ai-1%10; i+; /将得到的整型数组逆置赋给字符串 for(j=0
8、;ji;j+) cj=ai-j-1+0; if(Judge(c)/若积全为,则只输出一个 strcpy(c,0);/高精度乘法-高精度乘以高精度void BigNumMultiBig(char a1,char b1) int i,j,k,lena,lenb; int a1000=0,b1000=0,d2000=0; /将字符串转化为整型数组,并逆置 lena=strlen(a1); lenb=strlen(b1); for(i=0;ilena;i+) ai=a1lena-i-1-0; for(i=0;ilenb;i+) bi=b1lenb-i-1-0; /计算乘数从低位到高位以此乘以被乘数的低
9、位到高位 for(i=0;ilena;i+) for(j=0;jlenb;j+) di+j=di+j+ai*bj; di+j+1+=di+j/10; di+j=di+j%10; /根据高位是否为判断整型数组的位数 k=lena+lenb; while(!dk-1) k-; /积转化为字符型 for(i=0;ik;i+) ci=dk-1-i+0; if(Judge(c)/若积全为,则只输出一个 strcpy(c,0);/整型常量的阶乘void BigNumFact(int x) int i,k,m=0,a1000=0; a0=1; for(;x;x-) /m为在求阶乘过程中a的元素个数 for(
10、k=i=0;i=m;i+) k=k+ai*x;/数组各个元素均乘以x(x递减),以完成阶乘的运算 ai=k%10; k/=10; while(k) a+m=k%10; k/=10; /阶乘的结果转化为字符型 for(i=0;i0;i-) BigNumFact(i); strcpy(d,c); memset(c,0,sizeof(c); BigNumberAdd(d,sum); strcpy(sum,c); memset(c,0,sizeof(c); strcpy(c,sum);/将结果赋值给全局变量,进行输出/高精度的乘方,幂数为整型常量void BigNumInvol(char a1,int
11、 b1) int i; char temp1000; strcpy(temp,a1);/注意乘方是自己乘自己,而不是结果乘结果 for(i=2;ib1;i+) BigNumMultiBig(a1,temp); strcpy(temp,c); memset(c,0,sizeof(c);/将c清空,防止出现错误 /进行最后一次乘法 BigNumMultiBig(a1,temp); if(Judge(c)/若结果全为,则只输出一个 strcpy(c,0);/高精度除法-高精度除以低精度,只产生余数int BigNumDividSmall(char a1,int b1) if(!b1) return
12、0; int i,j,k,flag=0,a1000=0; char b2000; memset(b,0,sizeof(b); k=strlen(a1); for(i=0;ik;i+) ai=a1i-0; z=0; for(i=0;ik;i+) z=ai+z*10;/除法过程 bi=z/b1+0; z=z%b1; i=j=0; while(bi+=0); for(i=i-1;ik;i+) cj+=bi; return 1;/高精度除法-高精度除以高精度,只产生余数void BigNumDividBig(char a1,char b1) char a1000,b1000,time1000; int
13、 lena1,lentime,i,j,k,flag=0; memset(arr,0,sizeof(arr); /若被除数小于除数,则商为0,余数为被除数 if(Compare(a1,b1)0) strcpy(arr,a1); /若两数相等,则商为,余数为0 else if(!Compare(a1,b1) c0=1; /若被除数大于除数 else j=lentime=0; lena1=strlen(a1); memset(b,0,sizeof(b); memset(time,0,sizeof(time); for(i=0;i=0) BigNumberSub(b,b1); strcpy(b,c);
14、 memset(c,0,sizeof(c); timelentime+; flag=1;/控制time的元素的位置 if(flag)/将商转换为字符 timelentime+=0; else/当被除数前几位小于除数,商补0 timelentime=0; if(!strcmp(b,0)/若b为 j=0; else/继续在b的后面加值 j=strlen(b); lentime+; k=0; for(i=0;ilentime;i+) if(timei!=0) break;/找到time数组中第一个不为0的位置 for(j=i;jlentime;j+) ck+=timej; strcpy(arr,b)
15、; if(Judge(c) strcpy(c,0); if(Judge(arr) strcpy(arr,0);int main() int flag=0,a3,k,i; char a21000,b21000; printf(说明:该程序适用于正整数的高精度运算,并且运算结果的位数在位以内。n); while(1) printf(/*/n); printf(1、两数相加n); printf(2、两数相减n); printf(3、大数与低精度相乘n); printf(4、大数与大数相乘n); printf(5、大数的阶乘n); printf(6、大数的阶乘和n); printf(7、大数的乘方n)
16、; printf(8、大数除以低精度n); printf(9、大数除以大数n); printf(10、退出n); printf(/*/n); printf(请输入你想要进行的操作数:); scanf(%d,&k); getchar(); memset(c,0,sizeof(c); switch(k) case 1: printf(请输入您想要进行运算的两个数字:n); scanf(%s%s,a2,b2); BigNumberAdd(a2,b2); printf(%s+%s=%snn,a2,b2,c); break; case 2: printf(请输入您想要进行运算的两个数字:n); scan
17、f(%s%s,a2,b2); BigNumberSub(a2,b2); printf(%s-%s=%snn,a2,b2,c); break; case 3: printf(请输入您想要进行运算的两个数字:n); scanf(%s%d,a2,&a3); BigNumMultiSmall(a2,a3); printf(%s*%d=%snn,a2,a3,c); break; case 4: printf(请输入您想要进行运算的两个数字:n); scanf(%s%s,a2,b2); BigNumMultiBig(a2,b2); printf(%s*%s=%snn,a2,b2,c); break; ca
18、se 5: printf(请输入您想要的阶乘数:); scanf(%d,&a3); BigNumFact(a3); printf(%d!=%snn,a3,c); break; case 6: printf(请输入您想要的阶乘数:); scanf(%d,&a3); if(!a3) printf(0!=1nn); continue; BigNumFactAdd(a3); for(i=1;i=a3;i+) printf(%d!,i); if(i!=a3) printf(+); printf(=%snn,c); break; case 7: printf(请输入您想要进行运算的两个数字:n); sca
19、nf(%s%d,a2,&a3); BigNumInvol(a2,a3); printf(%s%d=%snn,a2,a3,c); break; case 8: printf(请输入您想要进行运算的两个数字:n); scanf(%s%d,a2,&a3); if(BigNumDividSmall(a2,a3) if(!z) printf(%s/%d=%snn,a2,a3,c); else printf(%s/%d=%s%ldnn,a2,a3,c,z); else printf(0不能作除数。nn); break; case 9: printf(请输入您想要进行运算的两个数字:n); scanf(%s%s,a2,b2); if(Judge(b2) printf(0不能作除数。nn); else BigNumDividBig(a2,b2); if(!Judge(arr) printf(%s/%s=%s%snn,a2,b2,c,arr); else printf(%s/%s=%snn,a2,b2,c); break; case 10: flag=1; printf(感谢您的使用,再见。nn); break; default: printf(对不起,您的输入有误,请重新输入。nn); if(flag) break; return 0;代码效果展示
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1