组别:入门级
难度:4
模拟竖式计算方法:将将两个高精度数接位拆分后存到a[],b[]数组中,再用c[]数组存储进位,通过模拟加法竖式来计算结果。
方法一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /**************************************************************** * Description: 大数加法 * Author: Alex Li * Date: 2023-07-07 21:45:54 * LastEditTime: 2024-01-31 05:06:23 ****************************************************************/ #include <iostream> #include <string> using namespace std; // 声明字符串来存储输入数字和数组来逐位存储它们的数字表示 string a1, b1; int a[101], b[101], c[102]; int main() { // 用于存储数字长度和其他实用变量的变量 int lena, lenb, lenc, i, x; cin >> a1; // 输入第一个大数字作为字符串 cin >> b1; // 输入第二个大数字作为字符串 lena = a1.length(); // 第一个数字的长度 lenb = b1.length(); // 第二个数字的长度 // 将第一个字符串(a1)以相反的顺序转换为整数数组 // 减去'0'是为了将字符数字转换为整数 for (i = 0; i < lena; i++) a[lena - i] = a1[i] - '0'; // 将第二个字符串(b1)以相反的顺序转换为整数数组 for (i = 0; i < lenb; i++) b[lenb - i] = b1[i] - '0'; // 初始化加法过程的变量 lenc = 1; // 和数组(c)的当前索引 x = 0; // 用于存储进位的变量 // 循环直到到达最长数字的末尾 while (lenc <= lena || lenc <= lenb) { c[lenc] = a[lenc] + b[lenc] + x; // 将对应的数字和进位相加 x = c[lenc] / 10; // 计算新的进位 c[lenc] %= 10; // 在去除进位后的当前位 lenc++; // 移动到下一位数字 } // 如果在最后一次操作后还有进位,将其加到结果中 c[lenc] = x; // 如果结果数组中的最后一个数字是0,减少结果的长度(以去除前导零) if (c[lenc] == 0) lenc--; // 以相反的顺序打印结果(因为结果是以相反的顺序存储的) for (i = lenc; i >= 1; i--) cout << c[i]; return 0; } |
方法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | //A,B为两个正整数 #include <iostream> #include <string> #include <algorithm> using namespace std; const int MAXN=10005; //max number int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans; void Read(int *arr, int &Len){ string cur; cin>>cur; Len=cur.length(); for(int i=0;i<Len;i++){ arr[i]=cur[i]-48; } reverse(arr,arr+Len); } int main() { Read(A,Len_A); Read(B,Len_B); Len_Ans=max(Len_A,Len_B); for(int i=0;i<=Len_Ans;i++){ Ans[i]=A[i]+B[i]+C[i]; if(Ans[i]>9){ C[i+1]++; Ans[i]=Ans[i]-10; } } while(Ans[Len_Ans]>0)Len_Ans++; for (int i =Len_Ans-1; i>=0;i--) { cout<<Ans[i]; } return 0; } |
洛谷P1601