题解 P1581 【A+B Problem(升级版)】
Level_Down · · 题解
可能会有更好的阅读体验
题意不再说明了,这里主要讲一下方法和几个坑点。
第一阶段:
在这一阶段中你需要清楚的知道这道题所需的方法:
首先是读入,然后需要每一位每一位按照类似高精度加法的方法来加。
只不过高精加法是满十进一,这里是满
最后是输出。
第二阶段:
在这一阶段你需要在知道方法的情况下实现代码。
首先是读入:
cin >> a[++cnt1]; //一个一个读入。
while(scanf("%c",&ch) != EOF)
{
if (ch == '+') flag = 1;//如果是加号,那接下来读入的就是b数组的数。
flag ? cin >> b[++cnt2] : cin >> a[++cnt1];
//通过flag来判断应该读入哪个数组的数。
}
cnt2--;//因为最后还会读入一个代表结束的符号,所以cnt2--。
*坑点: 不可以写以下这份代码,因为万位可能有两位,这个代码每次只能读入一位数。
cin >> s;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == '+') {flag = 1;continue;}
if (s[i] == ',') continue;
flag ? b[++cnt2] = s[i] - '0' : a[++cnt1] = s[i] - '0';
}
然后就是加法的步骤:
切记切记切记要先把
然后就是正常的加法步骤了,质数表自己手打就行了:
len = max(cnt1,cnt2);//len相当于其他一些代码中的c[0]。
for (int i = 1; i + i <= cnt1; i++) swap(a[i],a[cnt1 - i + 1]); //反转。
for (int i = 1; i + i <= cnt2; i++) swap(b[i],b[cnt2 - i + 1]);
for (int i = 1; i <= len; i++)//正常加法步骤
{
c[i] += a[i] + b[i];
c[i + 1] = c[i] / prime[i],c[i] %= prime[i];
}
if (c[len + 1]) len++;
//这上面一行是特殊进位。
最后是输出:
我绝对不会告诉你因为样例正反输出都一样就没有反着输出结果只得了20分的。
cout << c[len];//注意要反着输出就行了。
for (int i = len - 1; i >= 1; i--) cout << "," << c[i];
至此,我们就可以愉快地AC本题了:
#include <bits/stdc++.h>//目测是最短代码,只有20行。
using namespace std;//并且是截至作者写题解时的全洛谷最优解。
int a[10],b[10],c[10],flag,cnt1,cnt2,len,prime[10] = {0,2,3,5,7,11,13,17,19};char ch; string s;
int main(){//不加注释了。
cin >> a[++cnt1];
while(scanf("%c",&ch) != EOF) {
if (ch == '+') flag = 1;
flag ? cin >> b[++cnt2] : cin >> a[++cnt1];
}
cnt2--,len = max(cnt1,cnt2);
for (int i = 1; i + i <= cnt1; i++) swap(a[i],a[cnt1 - i + 1]);
for (int i = 1; i + i <= cnt2; i++) swap(b[i],b[cnt2 - i + 1]);
for (int i = 1; i <= len; i++){
c[i] += a[i] + b[i],c[i + 1] = c[i] / prime[i],c[i] %= prime[i];
}
if (c[len + 1]) len++;
cout << c[len];
for (int i = len - 1; i >= 1; i--) cout << "," << c[i];
return 0;
}
AC记录