特殊的加法
2026-04-01 19:55:23
发布于:浙江
1阅读
0回复
0点赞
------------------------------------------------------start--------------------------------------------------
1、想一想能不能写最单的代码。
我去试了一下,测试点1居然对了。
得分:10分
测试点信息:#1:AC,#2:WA,#3:WA,#4:WA,#5:WA,#6:WA,#7:WA,#8:WA,#9:WA,#10:WA
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long a, b;
cin >> a >> b;
cout << a + b <<endl;
return 0;
}
明显不能用这个方法。
2、思考怎么才能一位一位的运算,有进位往前进1。
使用字符串。
3、再想要不要去掉前导0。
需要。试了一下,测试点10要WA。
4、一点一点写代码。
(1)写基础部分。
#include<bits/stdc++.h>
using namespace std;
int main()
{
return 0;
}
(2)创建字符串并输入输出,再创建一个函数,还可以想到传回的是字符串,不然就无法进行运算,而且编译错误。
#include<bits/stdc++.h>
using namespace std;
string add(string a, string b)
{
}
int main()
{
string a, b;
cin >> a >> b;
cout << add(a, b) << endl;
return 0;
}
(3)编写加法程序。先不去前导0。
测试点信息:#1:AC,#2:AC,#3:AC,#4:AC,#5:AC,#6:AC,#7:AC,#8:AC,#9:AC,#10:WA【原因:没去前导0】
#include<bits/stdc++.h>//万能头文件
using namespace std;
// 高精度加法:传入两个数字字符串,返回和
string add(string a, string b)
{
string res;
int i = a.size() - 1, j = b.size() - 1;//保存2个字符串的长度
int carry = 0;
while (i >= 0 || j >= 0 || carry > 0)// 从后往前一位一位加
{
int num1 = (i >= 0) ? a[i--] - '0' : 0;//这一行和下一行都用了三目运算符
int num2 = (j >= 0) ? b[j--] - '0' : 0;
int sum = num1 + num2 + carry;//这一行和下面两行都在计算每一位是几
carry = sum / 10;
res.push_back(sum % 10 + '0');
}
reverse(res.begin(), res.end());// 反转得到正确顺序
return res;
}
int main()
{
string a, b;
cin >> a >> b;
cout << add(a, b) << endl;
return 0;
}
(4)加上去除前导0的代码。
#include<bits/stdc++.h>
using namespace std;
string add(string a, string b)// 高精度加法:传入两个数字字符串,返回和
{
string res;
int i = a.size() - 1, j = b.size() - 1;//保存2个字符串的长度
int carry = 0;
while (i >= 0 || j >= 0 || carry > 0)// 从后往前一位一位加
{
int num1 = (i >= 0) ? a[i--] - '0' : 0;//这一行和下一行都用了三目运算符
int num2 = (j >= 0) ? b[j--] - '0' : 0;
int sum = num1 + num2 + carry;//这一行和下面两行都在计算每一位是几
carry = sum / 10;
res.push_back(sum % 10 + '0');
}
reverse(res.begin(), res.end());// 反转得到正确顺序
int pos = 0;
while (pos < res.size() && res[pos] == '0') pos++;//此行和上一行都在去除前导0
return res.substr(pos);
}
int main()
{
string a, b;
cin >> a >> b;
cout << add(a, b) << endl;
return 0;
}
(5)虽然4已经AC,但是为了防止出现0和0相加,需要再加上一个if语句。
#include<bits/stdc++.h>
using namespace std;
string add(string a, string b)// 高精度加法:传入两个数字字符串,返回和
{
string res;
int i = a.size() - 1, j = b.size() - 1;//保存2个字符串的长度
int carry = 0;
while (i >= 0 || j >= 0 || carry > 0)// 从后往前一位一位加
{
int num1 = (i >= 0) ? a[i--] - '0' : 0;//这一行和下一行都用了三目运算符
int num2 = (j >= 0) ? b[j--] - '0' : 0;
int sum = num1 + num2 + carry;//这一行和下面两行都在计算每一位是几
carry = sum / 10;
res.push_back(sum % 10 + '0');
}
reverse(res.begin(), res.end());// 反转得到正确顺序
int pos = 0;
while (pos < res.size() && res[pos] == '0') pos++;//此行和上一行都在去除前导0
if (pos == res.size()) return "0"; // 全是零返回 0
return res.substr(pos);
}
int main()
{
string a, b;
cin >> a >> b;
cout << add(a, b) << endl;
return 0;
}
以上5为终极版代码,运行效率:极高,你学会了吗?
总结错误信息:
| 是什么 | 不是 | 就是 |
|---|---|---|
| 字母 | WA | AC |
------------------------------------------------------End----------------------------------------------------**
全部评论 1
好不容易写的
1周前 来自 浙江
0

有帮助,赞一个