大数系列——大数加法
2016-08-21 19:20
405 查看
这几天专门学习了一下大数的有关计算方法,大数加减乘除模都会在后面讲到。
一、大数加法:
加法算是最简单的一类大数问题,先写上我的代码:
1、用现在的方法而不用我之前的方法是因为现在这个方法灵活性更强,它可以把结果保存在相加的两个字符串的任意一个里,我之前的方法,是没有逆序排列的,所以说,这意味着只能先求出字符串长度len,再从len-1到0来逐位相加,这样我们就必须把相加的结果保存在第三个字符串里,浪费了内存。
2、用现在的方法,稍加修改,便可以实现连续多个大数相加。
多个大数连续相加代码如下:
加法就写到这里。
一、大数加法:
加法算是最简单的一类大数问题,先写上我的代码:
<span style="font-size:18px;"><strong></strong></span>
<span style="font-size:18px;"><strong>#include<stdio.h> #include<algorithm> using namespace std; char num1[111], num2[111], num3[111]; int L, M; int mark; void add(char a[], char b[], char c[]){ int len1 = strlen(a); int len2 = strlen(b); int i, j; int l = 0; L = 0; int temp; for(i = 0; i < len1/2; i++){ temp = a[i]; a[i] = a[len1-1-i]; a[len1-1-i] = temp; }//把输入的两个大数都逆序排列,这个循环很常见,可以专门写一个函数。 for(i = 0; i < len2/2; i++){ temp = b[i]; b[i] = b[len2-1-i]; b[len2-1-i] = temp; } for(i = 0; i < len1 && i < len2; i++){ M = (a[i] - '0' + b[i] - '0' + L) % 10; L = (a[i] - '0' + b[i] - '0' + L) / 10; c[i] = M + '0'; }//M是代表这一位的数,L是代表这一位两数相加后的十位数,也就是进位数的大小 if(i < len1){ for( ; i < len1; i++){ M = (a[i] - '0' + L) % 10; L = (a[i] - '0' + L) / 10; c[i] = M + '0'; } } if(i < len2){ for( ; i < len2; i++){ M = (b[i] - '0' + L) % 10; L = (b[i] - '0' + L) / 10; c[i] = M + '0'; } } while(L){ c[i++] = L + '0'; L /= 10; }//最后一位的进位不要忘记 mark = i-1; }//这个方法比较常见,最好要牢牢掌握 /*while(len1 >= 0 && len2 >= 0){ M = (a[len1] - '0' + b[len2] - '0' + L) % 10; L = (a[len1] - '0' + b[len2] - '0' + L) / 10; c[l++] = M + '0'; len1--; len2--; } while(len1 >= 0){ M = (a[len1] - '0' + L) % 10; L = (a[len1] - '0' + L) / 10; c[l++] = M + '0';len1--; } while(len2 >= 0){ M = (b[len2] - '0' + L) % 10; L = (b[len2] - '0' + L) / 10; c[l++] = M + '0';len2--; } while(L){ c[l++] = L + '0'; L /= 10; } for(i = 0; i < l/2; i++){ temp = c[i]; c[i] = c[l-1-i]; c[l-1-i] = temp; } for(i = 0; i < l; i++) printf("%c",c[i]);*/ int main(){ int i, j; int len1, len2; scanf("%s%s",num1,num2); len1 = strlen(num1); len2 = strlen(num2); add(num1,num2,num2); for(i = mark; i >= 0; i--) printf("%c",num2[i]); printf("\n"); return 0; }</strong></span>
1、用现在的方法而不用我之前的方法是因为现在这个方法灵活性更强,它可以把结果保存在相加的两个字符串的任意一个里,我之前的方法,是没有逆序排列的,所以说,这意味着只能先求出字符串长度len,再从len-1到0来逐位相加,这样我们就必须把相加的结果保存在第三个字符串里,浪费了内存。
2、用现在的方法,稍加修改,便可以实现连续多个大数相加。
多个大数连续相加代码如下:
#include<stdio.h> #include<algorithm> using namespace std; char num1[111], num2[111], num3[111]; int L, M; int mark; void reverse(char a[]){//逆序倒置函数 int len = strlen(a); int i; int temp; for(i = 0; i < len/2; i++){ temp = a[i]; a[i] = a[len-1-i]; a[len-1-i] = temp; } } void add(char a[], char b[], char c[]){ int len1 = strlen(a); int len2 = strlen(b); int i; int l = 0; L = 0; reverse(a); reverse(b); for(i = 0; i < len1 && i < len2; i++){ M = (a[i] - '0' + b[i] - '0' + L) % 10; L = (a[i] - '0' + b[i] - '0' + L) / 10; c[i] = M + '0'; } if(i < len1){ for( ; i < len1; i++){ M = (a[i] - '0' + L) % 10; L = (a[i] - '0' + L) / 10; c[i] = M + '0'; } } if(i < len2){ for( ; i < len2; i++){ M = (b[i] - '0' + L) % 10; L = (b[i] - '0' + L) / 10; c[i] = M + '0'; } } while(L){ c[i++] = L + '0'; L /= 10; } mark = i-1; } int main(){ int i; int len1, len2; memset(num2,0,sizeof(num2)); while(scanf("%s",num1) && strcmp(num1,"0")){ len1 = strlen(num1); len2 = strlen(num2); add(num1,num2,num2);//看,这样我们就能仅仅用两个字符串就完成了多个大数相加的功能 reverse(num2); } for(i = 0; i <= mark; i++) printf("%c",num2[i]); printf("\n"); return 0; }</strong></span>
加法就写到这里。
相关文章推荐
- 新手讲大数大数系列---加法
- 个人C++模板之大数系列(加法)
- 大数加法
- PKU 3982(大数加法)
- 大数加法、减法、乘法、除法实现
- G2: 大数加法
- 51nod——1005 大数加法
- 抓起根本(二)(hdu 4554 叛逆的小明 hdu 1002 A + B Problem II,数字的转化(反转),大数的加法......)
- 51nod 1005 大数加法
- 【九度】题目1198:大数加法
- 密码学之大数加法
- java实现大数加法(BigDecimal)的实例代码
- 大数的加法
- hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数快速取余)
- nefu 120 Lucas-Lehmer 梅森素数判别法 二分-大数乘法换加法
- 九度OJ 1137:浮点数加法 (大数运算)
- UVA 424 - Integer Inquiry(大数加法)
- 大数加法 减法 乘法 除法 高精度四则运算
- 大数加法 hdu 1002
- HDOJ2055_An easy problem(大数加法)