大数加法、减法、乘法、除法、求余、比较、乘方

前言:

大数的操作大部分人都知道,而且网上也有许多代码,但是那些大多比较冗长,吓到了许多同学们。。。所以特意写了个比较简短易懂的代码,代码基本上没问题,不过只支持正整数的输入数据。

样例:

12345 12
add:12357
subtract:12333
multiply:148140
devide:1028 remainder:9
power:12528328468279800008275836185265394560488525390625


  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdlib>
  5. usingnamespacestd;
  6. #defineSWAP(a,b)stringc;c=a;a=b;b=c//交换字符串
  7. intcompare(stringa,stringb){//大数比较
  8. if(a.length()<b.length()){
  9. return0;
  10. }elseif(a.length()==b.length()){
  11. if(a<b)return0;
  12. }return1;
  13. }
  14. stringadd(stringa,stringb){//大数加法
  15. if(!compare(a,b)){SWAP(a,b);}//保证a的长度大于b
  16. int*ad=newint[a.length()+1];
  17. memset(ad,0,sizeof(int)*(a.length()+1));//初始化
  18. inti,j;
  19. for(i=0;i<a.length()-b.length();i++)//将a长度大于b的部分传过去
  20. ad[i+1]=a[i]-'0';
  21. for(j=0;i<a.length();i++,j++)//将a与b匹配的部分相加再传
  22. ad[i+1]=a[i]-'0'+b[j]-'0';
  23. for(i=a.length();i>0;i--){//进位操作
  24. if(ad[i]>9){
  25. ad[i-1]+=ad[i]/10;
  26. ad[i]%=10;
  27. }
  28. }
  29. char*c=newchar[a.length()+1];//定义一个字符数组保存结果
  30. i=0,j=0;
  31. while(ad[i]==0)i++;//去除前导0
  32. while(i<a.length()+1)c[j++]=ad[i++]+'0';
  33. c[j]='\0';
  34. if(c[0]=='\0'){c[1]='\0';c[0]='0';}//如果结果为0
  35. free(ad);//释放ad数组
  36. strings(c);//将c转换成string类型
  37. returns;
  38. }
  39. stringsubtract(stringa,stringb){
  40. intflag=0,i,j;
  41. if(!compare(a,b)){//如果a<b,交换a、b并标识结果为负
  42. flag=1;
  43. SWAP(a,b);
  44. }
  45. int*su=newint[a.length()];
  46. memset(su,0,sizeof(int)*a.length());//初始化
  47. for(i=0;i<a.length()-b.length();i++)//将a长度大于b的部分传过去
  48. su[i]=a[i]-'0';
  49. for(j=0;i<a.length();i++,j++)//将a与b匹配的部分相减再传
  50. su[i]=a[i]-b[j];
  51. for(i=a.length()-1;i>0;i--){//进位操作
  52. if(su[i]<0){
  53. su[i-1]--;
  54. su[i]+=10;
  55. }
  56. }
  57. char*c=newchar[a.length()+2];
  58. i=0,j=0;
  59. if(flag)c[j++]='-';//如果是负数,c[0]='-'
  60. while(su[i]==0)i++;//后面同加法
  61. while(i<a.length())c[j++]=su[i++]+'0';
  62. c[j]='\0';
  63. if(c[0]=='\0'){c[1]='\0';c[0]='0';}
  64. free(su);
  65. strings(c);
  66. returns;
  67. }
  68. stringmultiply(stringa,stringb){
  69. int*mu=newint[a.length()+b.length()];
  70. memset(mu,0,sizeof(int)*(a.length()+b.length()));
  71. for(inti=0;i<a.length();i++)//将数字两两相乘
  72. for(intj=0;j<b.length();j++)
  73. mu[i+j+1]+=(a[i]-'0')*(b[j]-'0');
  74. for(inti=a.length()+b.length()-1;i>0;i--){//进位操作
  75. if(mu[i]>9){
  76. mu[i-1]+=mu[i]/10;
  77. mu[i]%=10;
  78. }
  79. }
  80. //后面同加法
  81. char*c=newchar[a.length()+b.length()];
  82. inti=0,j=0;
  83. while(mu[i]==0)i++;
  84. while(i<a.length()+b.length())c[j++]=mu[i++]+'0';
  85. c[j]='\0';
  86. if(c[0]=='\0'){c[1]='\0';c[0]='0';}
  87. free(mu);
  88. strings(c);
  89. returns;
  90. }
  91. string*devide(stringa,stringb){
  92. string*de=newstring[2];
  93. de[0]="0";de[1]=b;
  94. stringone="1",ten="10";
  95. if(!compare(a,b))returnde;
  96. while(a[0]!='-'){
  97. de[1]=a;
  98. a=subtract(a,b);
  99. de[0]=add(de[0],one);
  100. }
  101. de[0]=subtract(de[0],one);
  102. returnde;
  103. }
  104. stringpower(stringa,stringb){
  105. stringc="1",one="1";
  106. while(b[0]!='0'){
  107. c=multiply(c,a);
  108. b=subtract(b,one);
  109. }
  110. returnc;
  111. }
  112. intmain(intargc,charconst*argv[]){
  113. stringa,b,c1,c2,c3,c5;
  114. string*c4;
  115. intcas;
  116. cin>>cas;
  117. while(cas--){
  118. cin>>a>>b;
  119. c1=add(a,b);
  120. c2=subtract(a,b);
  121. c3=multiply(a,b);
  122. c4=devide(a,b);
  123. c5=power(a,b);
  124. cout<<"add:"<<c1<<endl<<"subtract:"<<c2<<endl
  125. <<"multiply:"<<c3<<endl<<"devide:"<<c4[0]<<"remainder:"<<c4[1]<<endl
  126. <<"power:"<<c5<<endl;
  127. }
  128. return0;
  129. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值