加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

10、大数,高精度计算---百位大数

发布时间:2020-12-14 03:32:09 所属栏目:大数据 来源:网络整理
导读:大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。 一般情况下大数的存储是采用字符数组来存储,即将大数当作一个字符串来存储

大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。

一般情况下大数的存储是采用字符数组来存储,即将大数当作一个字符串来存储,而对其处理是按其处理规则在数组中模拟实现。

七 百位大数。

百位大数...让人又爱又恨阿。 ?回想去年,初学c语言,实验就有这个。
那时候折腾老久了。 ? ? ? ? ? ?刻苦铭心呀。
写这篇博客,没其他意思,主要是为了回忆回忆,然后记录一下当初的代码,便于以后翻看。

代码是大一上学期写的。可能比较水,大神们勿喷,纯属自己娱乐罢了。
?
实验题目:

此次实验要求利用数组实现两个百位大数(共有100位数字)的加、减、乘法的运算。
实现下列三个函数的功能(以下函数应在fun.h中声明,在fun.c中实现)
? 函数原型:

/*实现两个大数的相加*/
?? char* add(char* data,char* addend,char* result);

/*实现两个大数的相减*/
?? char* minus(char* data,char* sub,char* result);

/*实现两个大数的相乘*/
?? char* multiply(char* data,char* mult,char* result);

?

实验内容:

在给出的程序框架中完成实验题目。
mylib.c包括此次实验的程序框架。
?(在给出的程序框架中补充设计并完成实验。)

注:检验计算结果是否正确可利用提供的 test.exe 文件。
在mylib.exe和test.exe文件中输入相同的种子则会产生相同的随机大数。可以用test.exe产生的结果和mylib.exe对照结果检验对错。

请注意其中test.exe文件的输出格式和框架规定的输出格式有所不同。

?

提示:

字符型与整型转换

1.可以模拟笔算加减乘的过程,用数组储存大数;
2.可以用atoi和itoa函数;
3.对于一位整数的整型转换为字符型:

例:
char c;
int i = 9;
c = i+’0’;
printf(“%c”,c);

?



main.c

[cpp]? view plain copy
  1. /*?姓名:****?
  2. ???班级:软件三班?
  3. ???学号:****?
  4. ???功能:百位大数?
  5. ???时间:2012.12.2??*/??
  6. #include?<stdio.h>??
  7. #include?<stdlib.h>??
  8. #include?<string.h>??
  9. #include?"fun.h"??
  10. ??
  11. #define?N?100??
  12. /*?产生随机的大数??*/??
  13. void?create(char*?num,?unsigned?seed);??/*seed?为随机种子*/??
  14. ??
  15. char?result[2?*?N]?=?{''};??
  16. int?main(void)??
  17. {??
  18. ????char?num[N];//多出符号位??
  19. ????char?n[N];??
  20. ????//设定随机种子??
  21. ????unsigned?int?seed;??
  22. ????printf("Please?input?a??rand?seed:");??
  23. ????scanf("%u",?&seed);??
  24. ????printf("nThe?seed?is?%un",?seed);??
  25. ??//产生随机大数??
  26. ????create(num,?seed);??
  27. ????create(n,?seed+1);??
  28. ????printf("***********************************************n");??
  29. ????printf("num:?%sn?n?:?%sn",?num,?n);??
  30. ????//调用加法??
  31. ????add(num,?n,?result);??
  32. ????printf("num?+?n?=?%sn",?result);??
  33. //调用减法??
  34. ????minus(num,248); line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????printf("num?-?n?=?%sn",0); background-color:inherit">//调用乘法??
  35. ????multiply(num,248); line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????printf("num?*?n?=?%sn",248); line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????system("pause");??
  36. ????return?0;??
  37. }??
  38. char?num[],?unsigned?seed)??
  39. int?i?=?0,?x?=?0;??
  40. int?times,?flag?=?1;??
  41. ????srand(seed);??
  42. ????times?=?rand()?%?(N?-?2)?+?1;//避免溢出??
  43. ????if(rand()?%?2)//随机生成负数??
  44. ????????num[i]?=?'-';??
  45. ????????i++;??
  46. ????????if(times?==?1)??
  47. ????????????times++;??
  48. ????}??
  49. while(flag)//避免高位为零??
  50. ????{??
  51. ????????x?=?rand()?%?10;??
  52. if(x?!=?0)??
  53. ????????{??
  54. ????????????flag?=?0;??
  55. ????????}??
  56. ????num[i]?=?x?+?'0';??
  57. ????i++;??
  58. for(;?i?<?times;?i++)??
  59. ????????num[i]?=?x?+?'0';??
  60. ????}??
  61. ????num[times]?=?'';??
  62. }??

fun.h

copy
    #ifndef?FUN_H_INCLUDED??
  1. #define?FUN_H_INCLUDED??
  2. //此方法实现加法运算??
  3. char*?add(char*?data,?char*?addend,87); background-color:inherit; font-weight:bold">char*?result);??
  4. //此方法实现减法运算??
  5. char*?minus(char*?sub,87); background-color:inherit; font-weight:bold">char*?result);??
  6. //此方法实现乘法运算??
  7. char*?multiply(char*?mult,248); line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> #endif?//?FUN_H_INCLUDED??


fun.c

copy
    #include<stdio.h>??
  1. #include<stdlib.h>??
  2. #include"fun.h"??
  3. #include<string.h>??
  4. #define?N?100??
  5. //在此添加加法的实现??
  6. char*?result)??
  7. {??
  8. int?i=0,a1,a2;??
  9. char?pdata[2*N]={''};??
  10. char?padden[2*N]={''};//定义两个char类型的字符数组,并初始化每一位都置为''??
  11. ????a1=strlen(data);??
  12. ????a2=strlen(addend);//统计两个数组中字符串长度??
  13. ????strcpy(pdata,data);//将字符串data复制到字符数组pdata[N]中??
  14. ????strcpy(padden,addend);//将字符串addend复制到字符数组padden[N]中??
  15. for(i=0;result!=''&&i<2*N;i++)//将字符数组result[2*N]初始化每一位都置为''??
  16. ????{??
  17. ??????result[i]='';??
  18. if(pdata[0]!='-'&&padden[0]!='-')//当两个数均为正整数时??
  19. ??????if(a1?>=?a2)//第一个数的长度大于第二个数时??
  20. ??????{??
  21. for(;a2>0;a2--,a1--)//两个正数对应位相加??
  22. ??????????result[a1-1]=pdata[a1-1]+padden[a2-1]-'0';//将相加得到的字符结果转化为数字字符??
  23. ??????????if(result[a1-1]>'9'&&(a1-1)>0)//考虑进位的情况??
  24. ??????????{??
  25. ????????????result[a1-1]?-=?10;??
  26. ????????????pdata[a1-2]++;??
  27. ??????????}??
  28. ????????}??
  29. ????????for(;a1>=1;a1--)//第一个数比第二个数多余的位数和'0'相加得到的结果??
  30. ????????{??
  31. ??????????result[a1-1]=result[a1-1]+pdata[a1-1];??
  32. ??????????if(result[a1-1]>'9'&&(a1-1)>0)??
  33. ??????????{??
  34. ????????????result[a1-1]-=10;//考虑到进位的情况??
  35. ????????????pdata[a1-2]++;??
  36. ??????????}??
  37. if(result[0]>'9')//当result[]中第一位>'9',要进行进位操作??
  38. ??????????a1=strlen(data);??
  39. for(;a1>0;a1--)??
  40. ????????????result[a1]=result[a1-1];??
  41. ??????????result[1]-=10;??
  42. ??????????result[0]='1';//首位进位加'1'??
  43. ??????}??
  44. ??????else?if(a1<a2)//第一个数的长度小于第二个数时,可以将加数与被加数调换再调用函数add()??
  45. ??????{???????add(addend,data,result);??
  46. ??????}??
  47. if(pdata[0]=='-'&&padden[0]=='-')?//当为两个数都为负数时??
  48. ??????result[0]='-';//result[]数组中第一位应为'-'??
  49. ??????add(&data[1],&addend[1],&result[1]);??
  50. if(pdata[0]!='-'&&padden[0]=='-')//当第一个为正,第二个为负时,可以看做两个数相减,调用下面的minus()??
  51. ??????minus(pdata,&padden[1],153); background-color:inherit; font-weight:bold">else?//当第一个为负,第二个为正时??
  52. ??????add(addend,153); background-color:inherit; font-weight:bold">return?result;??
  53. }//在此添加减法的实现??
  54. char*?result)??
  55. int?i,b1,b2,p,dif;??
  56. char?pdata[N]={''},?psub[N]={''};??
  57. ????strcpy(psub,sub);//将字符串sub复制到字符数组psub[N]中??
  58. for(i=0;result[i]!=''&&i<N;i++) ????b1=strlen(pdata);??
  59. ????b2=strlen(psub);??
  60. if(pdata[0]!='-'&&psub[0]!='-')//两个数都为正数??
  61. if(b1>b2)//第一个数位数大于第二个数时??
  62. for(;b2-1>=0;b1--,b2--)//两个正数对应位相减??
  63. ?{??
  64. ??????????result[b1-1]=pdata[b1-1]-psub[b2-1]+'0';//将相减得到的字符结果转化为数字字符??
  65. if(result[b1-1]<'0')//考虑相减小于0的情况,要移位处理??
  66. ????????????result[b1-1]+=10;??
  67. ????????????pdata[b1-2]--;??
  68. ????????p=b1;??
  69. while?(pdata[p-1]<'0'&&p>1)//当两个对应数相减小于'0'时,要位处理??
  70. ??????????pdata[p-1]+=10;??
  71. ??????????pdata[p-2]--;??
  72. ??????????p--;??
  73. if(b1>1)//第一个数比第二个数多余的位数和'0'相减得到的结果全部赋给result[]??
  74. for(;b1>0;b1--)??
  75. ????????????result[b1-1]=pdata[b1-1];??
  76. while?(result[0]=='0')//当移位相减后首位为'0'时??
  77. ??????????b1=strlen(pdata);??
  78. for(i=0;i<=b1;i++)??
  79. ????????????result[i]=result[i+1];//要将result[]中的数都向前移一位??
  80. if(b1?<?b2) ??????minus(psub,pdata,&result[1]);//将减数与被减数置换,再调用minus()??
  81. ?}??
  82. else//第一个数位数等于第二个数时??
  83. if(pdata[0]!=psub[0])//考虑两个数组第一个数是否相等??
  84. for(i=0;pdata[i]!=psub[i];i++)??
  85. ???????{??
  86. ??????????;??
  87. ???????}??
  88. ???????dif=i;//如果不相等下标digit设为i??
  89. else??
  90. ??????{??
  91. ????????dif=0;//如果相等下标digit设为0??
  92. if(pdata[dif]>psub[dif])//当第一个数组中元素对应数值大于相同位的第二个数组中的元素??
  93. for(i=(?b1-dif?)?;?i?>?0?;?i?--,b1--,dif--)//对应位上的数值相减??
  94. ??????????result[b1-dif-1]?=pdata[?b1-1?]?+'0'-?psub[b2-1];//将相减得到的字符结果转化为数字字符??
  95. if(result[b1-dif-1]?<?'0')??
  96. ????????????pdata[?b1-2?]--;??
  97. ????????????result[b1-dif-1]?+=?10;??
  98. //当两个数组第一位数值相同,减去得到的结果为0??
  99. for(i?=?0?;i?<?b1-dif?;?i++)//要将result[]数组中所有数向前移一位??
  100. ????????????result[i]=result[i+1];??
  101. if(pdata[dif]?<?psub[dif])//当第一个数组中元素对应数值小于相同位的第二个数组中的元素??
  102. ????????result[0]='-';//两个数组第一位元素相减对应数值小于0,想减结果第一位为'-'??
  103. for(i?=?b1;i?>?0?;?i--)??
  104. ??????????pdata[i]?=?pdata[i-1];//要pdata[]数组中所有数向后移一位??
  105. ??????????pdata[0]?=?'-';//相当于一个一个正数和一个负数做加法??
  106. ??????????add(psub,&pdata[1],0); background-color:inherit">//调用加法函数add()??
  107. //当第一个数组中元素对应数值等于相同位的第二个数组中的元素??
  108. ????????result[0]='0';??
  109. ????????result[1]='';//最终result[]输出结果为0??
  110. ???}??
  111. ???if(pdata[0]=='-'&&psub[0]!='-')//当第一个为负,第二个为正时,可以看做一个负数和一个正数做加法,调用加法函数add()??
  112. ???{??
  113. ?????result[0]='-';??
  114. ?????add(&pdata[1],psub,108); list-style:decimal-leading-zero outside; color:inherit; line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> ???}??
  115. ???if(pdata[0]!='-'&&psub[0]=='-')??
  116. ???{??
  117. ????add(pdata,&psub[1],153); background-color:inherit; font-weight:bold">else??
  118. ????minus(&sub[1],&data[1],result);//当两个数都为负时,调用减法函数?minus()??
  119. }??
  120. //在此添加乘法的实现??
  121. ?char?*multiply(int?digit,i,k,c1,c2,c3,num;??
  122. char?pdata[N]={''};??
  123. char?pmult[N]={''};char?array[2*N]={''};//定义一个数组array[],用来存放第二个数每位相乘第一个数得到的结果??
  124. ????strcpy(pdata,0); background-color:inherit">//将字符串data复制到字符数组pdata[N]中??
  125. ????strcpy(pmult,mult);//将字符串mult复制到字符数组pmult[N]中??
  126. ????c1=strlen(data);??
  127. ????c2=strlen(mult);//统计两个数组中字符串长度??
  128. for(i=0;result[i]!=''&&i<2*N;i++)//将字符数组result[2*N]初始化每一位都置为''??
  129. ??????result[i]='';??
  130. if(pdata[0]!='-'&&pmult[0]!='-')//当相乘的两个数均为正整数时??
  131. for(i=c1-1;i>=0;i--)??
  132. ????????digit=c1-i-1;//统计array[]中需储存元素位数??
  133. ????????num=pdata[i]-'0';??
  134. if(num>0)//当num>0时,将array[]先全部初始化每一位都置为''??
  135. for(k=0;array[k]!=''&&k<2*N;k++)??
  136. ????????????array[k]='';??
  137. for(;num>0;num--)//mult[]数组中每一位对应数值数,相应array[]中元素要乘以相同倍数,可以通过连续加法来实现??
  138. ????????????add(array,pmult,array);??
  139. ???????????c3=strlen(array);//重新统计新得到的数组array[]中字符串长度??
  140. for(;digit>0;digit--)??
  141. ????????????array[c3+digit-1]='0';??
  142. ??????????add(array,result,0); background-color:inherit">//需将array[]中的元素错位累加即可得到最终相乘的结果??
  143. if(pdata[0]=='-'&&pmult[0]!='-')??
  144. ??????result[0]='-';??
  145. ??????multiply(&pdata[1],&result[1]);??
  146. if(pdata[0]!='-'&&pmult[0]=='-')??
  147. ??????result[0]='-';??
  148. ??????multiply(pdata,&pmult[1],153); background-color:inherit; font-weight:bold">if(pdata[0]=='-'&&pmult[0]=='-')//当两个数均为负整数时,相当于两个正整数相乘,调用函数multiply[]??
  149. ??????multiply(&pdata[1],108); list-style:decimal-leading-zero outside; color:inherit; line-height:17.600000381469727px; margin:0px!important; padding:0px 3px 0px 10px!important"> }??

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读