如果要计算的数超过了long long怎么解决? —>使用高精度加减乘除,简单理解就是 很大的数进行加减乘除。
#include<bits/stdc++.h> using namespace std; int a[510], b[510], c[510];//a:被加数 b:加数 c:和 int main(){ // 1. 输入字符串 string str1,str2; cin >> str1 >> str2; // 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1} for (int i = 0; i < str1.size(); i ++) a[str1.size()-1 - i] = str1[i] - '0'; for (int i = 0; i < str2.size(); i ++) b[str2.size()-1 - i] = str2[i] - '0'; // 3. 找两个字符串最大的个数,目的是为了将每一位计算完 int ans = max(str1.size(), str2.size()); // 4. 相加(a+b) for (int i = 0; i < ans; i ++){//遍历至最大长度,避免有的数字没计算 c[i] += a[i] + b[i];//相加 c[i+1] = c[i] / 10;// 进位 c[i] %= 10;//将加的结果求余10 得出第i位 } //4. 如果结果数组第ans位的数大于0(大于0代表进位了),则让长度增加1 while(c[ans]>0) ans++; //5. 倒序输出 for (int i = ans-1; i >= 0; i--) cout << c[i]; return 0; }
#include<bits/stdc++.h> using namespace std; int a[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:加数1 b:加数2 c:进位数组 ans:结果数组 int main(){ // 1. 输入字符串 string str1,str2; cin >> str1 >> str2; len_a = str1.length(); len_b = str2.length(); // 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1} for (int i = 0; i < str1.size(); i ++) a[str1.size()-1 - i] = str1[i] - '0'; for (int i = 0; i < str2.size(); i ++) b[str2.size()-1 - i] = str2[i] - '0'; // 3. 找两个字符串最大的个数,目的是为了将每一位计算完 len_ans = max(len_a,len_b); // 4. 相加(a+b) for(int i=0;i<=len_ans;i++){ ans[i] = a[i] + b[i] + c[i];//结果数组 =(等于) 被加数 加上 加数 加上 进位的数 if(ans[i] > 9){//如果结果数组大于9,则进位 c[i+1] = ans[i] / 10;//给进位数组赋值 ans[i] %= 10; // 让结果数组大于9的数求余10,变成个位数 } } //5. 如果结果数组len_ans位的数大于0,则让长度增加1 while(ans[len_ans]>0) len_ans++; //6. 倒叙输出 for(int i=len_ans-1;i>=0;i--) cout<<ans[i]; return 0; }
#include<bits/stdc++.h> using namespace std; int a[510], b[510], c[510];//a:被减数 b:减数 c:结果 int main(){ // 1. 输入字符串 string str1,str2; cin >> str1 >> str2; // 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1} for (int i = 0; i < str1.size(); i ++) a[str1.size()-1 - i] = str1[i] - '0'; for (int i = 0; i < str2.size(); i ++) b[str2.size()-1 - i] = str2[i] - '0'; // 3. 找两个字符串最大的个数,目的是为了将每一位计算完 int ans = max(str1.size(), str2.size()); // 4. 相减(a-b) for (int i = 0; i < ans; i ++){//遍历至最大长度,避免有的数字没计算 if(a[i] < b[i]){ a[i+1] -= 1;//向前借一位 a[i] += 10;// 借一位以后加10 } c[i] = a[i] - b[i]; } //5. 如去掉前导 0 。例如结果为:089,不需要0 while(c[ans-1]==0 && ans>1) ans--; //6. 倒序输出 for (int i = ans-1; i >= 0; i--) cout << c[i]; return 0; }
#include<bits/stdc++.h> using namespace std; int a[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:被减数 b:减数 c:进位 ans:结果 int main(){ // 1. 输入字符串 string str1,str2; cin >> str1 >> str2; len_a = str1.length(); len_b = str2.length(); // 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1} for (int i = 0; i < str1.size(); i ++) a[str1.size()-1 - i] = str1[i] - '0'; for (int i = 0; i < str2.size(); i ++) b[str2.size()-1 - i] = str2[i] - '0'; // 3. 找两个字符串最大的个数,目的是为了将每一位计算完 len_ans = max(len_a,len_b); // 4. 相减(a-b) for(int i=0;i<=len_ans;i++){ ans[i] = a[i] - b[i] - c[i];//结果数组 =(等于) 被减数 减去 减数 减去 进位的数 if(ans[i] < 0){//如果结果数组小于0,则借位 ans[i] += 10;// 借1位,加上10 c[i+1]++; // 进位数组加1 } } //5. 如去掉前导 0 。例如结果为:089,不需要0 while(len_ans>1 && ans[len_ans-1]==0) len_ans--; //6. 倒序输出 for(int i=len_ans-1;i>=0;i--) cout<<ans[i]; return 0; }
#include<bits/stdc++.h> using namespace std; int a[510], b[510], c[510];//a:被减数 b:减数 c:结果 int flag = 0; int main(){ // 1. 输入字符串 string str1,str2; cin >> str1 >> str2; //2. str1.size() < str2.size() 或者 两个数一样长并且被减数的数值小于减数时,才需要交换两数位置 if(str1.size() < str2.size() || str1.size() == str2.size() && str1 < str2) { string t = str1; str1 = str2; str2 = t; flag = 1; } // 3. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1} for (int i = 0; i < str1.size(); i ++) a[str1.size()-1 - i] = str1[i] - '0'; for (int i = 0; i < str2.size(); i ++) b[str2.size()-1 - i] = str2[i] - '0'; // 4. 找两个字符串最大的个数,目的是为了将每一位计算完 int ans = max(str1.size(), str2.size()); // 5. 相减(a-b) for (int i = 0; i < ans; i ++){//遍历至最大长度,避免有的数字没计算 if(a[i] < b[i]){ a[i+1] -= 1;//向前借一位 a[i] += 10;// 借一位以后加10 } c[i] = a[i] - b[i]; } //6.如去掉前导 0 。例如结果为:089,不需要0 while(c[ans-1]==0 && ans>1) ans--; //7. 倒叙输出 if(flag == 1) cout<<"-"; for (int i = ans-1; i >= 0; i--) cout << c[i]; return 0; }