ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:45.57KB ,
资源ID:8054828      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8054828.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(大数运算.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

大数运算.docx

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