题目描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
输入样例
22222222222222222222
33333333333333333333
输出样例
55555555555555555555
解题思路:
简单的高精算法
(本人最近一直在做高精),没什么好强调的,就是去前导零比较麻烦罢了。
代码:
高精:
#include<iostream>
#define MAX 1000+5
using namespace std;
int op1[MAX], op2[MAX], op3[MAX];
int main()
{
char str1[MAX];
char str2[MAX];
cin >> str1;
cin >> str2;
int len1 = strlen(str1);
int len2 = strlen(str2);
//转储
for (int i = len1 - 1; i >= 0; i--)
op1[len1 - 1 - i] = str1[i] - '0';
for (int i = 0; i < len2; i++)
op2[len2 - 1 - i] = str2[i] - '0';
//高精度的位数
int L = len1 > len2 ? len1 : len2;
//计算-进位
for (int i = 0; i < L; i++)
{
op3[i] += op1[i] + op2[i];
if (op3[i] >= 10)
{
op3[i + 1] = 1;
op3[i] %= 10;
}
}
//判断最高位有没有进位
if (op3[L] == 1)
L++;
去前导零 && cout:
//去前导0
int k = L - 1;
while (op3[k] == 0)
k--;
//输出
for (int i = k; i >= 0; i--)
{
cout << op3[i];
}
return 0;
}
总代码:
#include<iostream>
#define MAX 1000+5
using namespace std;
int op1[MAX], op2[MAX], op3[MAX];
int main()
{
char str1[MAX];
char str2[MAX];
cin >> str1;
cin >> str2;
int len1 = strlen(str1);
int len2 = strlen(str2);
//转储
for (int i = len1 - 1; i >= 0; i--)
op1[len1 - 1 - i] = str1[i] - '0';
for (int i = 0; i < len2; i++)
op2[len2 - 1 - i] = str2[i] - '0';
//高精度的位数
int L = len1 > len2 ? len1 : len2;
//计算-进位
for (int i = 0; i < L; i++)
{
op3[i] += op1[i] + op2[i];
if (op3[i] >= 10)
{
op3[i + 1] = 1;
op3[i] %= 10;
}
}
//判断最高位有没有进位
if (op3[L] == 1)
L++;
//去前导0
int k = L - 1;
while (op3[k] == 0)
k--;
//输出
for (int i = k; i >= 0; i--)
{
cout << op3[i];
}
return 0;
}
正解,
AC!
P.S:(史上最短高精)
Python
a=input()
b=input()
a=int(a)
b=int(b)
print(a+b)
自己学着玩的.......QAQ