1074 宇宙无敌加法器(附详细注释,逻辑分析)

写在前面

  • 题目相对简单
  • 直观思路
    • 字符串读入、翻转、遍历进制求和计数
  • 测试点错误
    • 最后进位未处理,导致2/4测试点
    • 0进制,0+0结果为0,第5个测试点

测试用例

input : 
30527
06203
415
output : 
7201

input : 
0
0
0
output : 
0

ac代码

  • 倒序处理
#include
#include
using namespace std;
int main()
{
    string jzb, a_str, b_str;
    cin >> jzb >> a_str >> b_str;
    reverse(jzb.begin(), jzb.end());
    reverse(a_str.begin(), a_str.end());
    reverse(b_str.begin(), b_str.end());

    int jw = 0, a, b, bcs;
    string result = "";
    for(int i=0; i<jzb.size(); i++)
    {
        bcs = jzb[i]!='0' ? jzb[i]-'0' : 10;
        a = i<a_str.size() ? a_str[i]-'0' : 0;
        b = i<b_str.size() ? b_str[i]-'0' : 0;
        result += (jw + a + b)%bcs+'0';
        jw = (jw + a + b)/bcs;

    }
    if(jw>0) result += '1'; // 导致 测试点 2/4错误
    reverse(result.begin(), result.end());

    int inx = 0;
    for(int j=0; j<result.size(); j++)
    {
        if(result[j]!='0')
            break;
        inx++;
    }
    result = inx<result.size() ? result.substr(inx) : "0";
    printf("%s", result.c_str());
//    printf("%s", result.data());
//    cout << result;
    return 0;
}

参考链接

  • 正序处理
#include 
using namespace std;
int main() {
    string s, s1, s2, ans;
    int carry = 0, flag = 0;
    cin >> s >> s1 >> s2;
    ans = s;
    string ss1(s.length() - s1.length(), '0');
    s1 = ss1 + s1;
    string ss2(s.length() - s2.length(), '0');
    s2 = ss2 + s2;
    for(int i = s.length() - 1; i >= 0; i--) {
        int mod = s[i] == '0' ? 10 : (s[i] - '0');
        ans[i] = (s1[i] - '0' + s2[i] - '0' + carry) % mod + '0';
        carry = (s1[i] - '0' + s2[i] - '0' + carry) / mod;
    }
    if (carry != 0) ans = '1' + ans;
    for(int i = 0; i < ans.size(); i++) {
        if (ans[i] != '0' || flag == 1) {
            flag = 1;
            cout << ans[i];
        }
    }
    if (flag == 0) cout << 0;
    return 0;
}

知识点

  • 字符串补全
    • 方式1
    string s0(3,'0'), s = "1";
    cout << s0 << endl;
    cout << s0 + s;
    
    • 方式2
    string s0, s="1";
    for(int i=0; i<3; i++) s0+='0';
    cout << s0 << endl;
    cout << s0 + s;
    
    • 方式3
    string s0, s="1";
    for(int i=0; i<3; i++)
        s0.insert(0, "0");
    cout << s0 << endl;
    cout << s0 + s;
    

你可能感兴趣的:(PAT(乙级),算法比赛相关)