1074 宇宙無敵加法器 (20 分)

地球人習慣使用十進制數,並且默認一個數字的每一位都是十進制的。而在 PAT 星人開掛的世界裏,每個數字的每一位都是不同進制的,這種神奇的數字稱爲“PAT數”。每個 PAT 星人都必須熟記各位數字的進製表,例如“……0527”就表示最低位是 7 進制數、第 2 位是 2 進制數、第 3 位是 5 進制數、第 4 位是 10 進制數,等等。每一位的進制 d 或者是 0(表示十進制)、或者是 [2,9] 區間內的整數。理論上這個進製表應該包含無窮多位數字,但從實際應用出發,PAT 星人通常只需要記住前 20 位就夠用了,以後各位默認爲 10 進制。

在這樣的數字系統中,即使是簡單的加法運算也變得不簡單。例如對應進製表“0527”,該如何計算“6203 + 415”呢?我們得首先計算最低位:3 + 5 = 8;因爲最低位是 7 進制的,所以我們得到 1 和 1 個進位。第 2 位是:0 + 1 + 1(進位)= 2;因爲此位是 2 進制的,所以我們得到 0 和 1 個進位。第 3 位是:2 + 4 + 1(進位)= 7;因爲此位是 5 進制的,所以我們得到 2 和 1 個進位。第 4 位是:6 + 1(進位)= 7;因爲此位是 10 進制的,所以我們就得到 7。最後我們得到:6203 + 415 = 7201。

輸入格式:

輸入首先在第一行給出一個 N 位的進製表(0 < N ≤ 20),以回車結束。 隨後兩行,每行給出一個不超過 N 位的非負的 PAT 數。

輸出格式:

在一行中輸出兩個 PAT 數之和。

輸入樣例:

30527
06203
415

輸出樣例:

7201

這題我也是醉了,怎麼改測試點1、3都錯,我都幾乎改的一個AC代碼除了變量名別的完全一樣了,還是錯的!我無語!如果有閒的沒事的網友可以試試找不同。

思路:

1.注意輸入進制的位數可能比加數的位數少

2.注意相加得0的情況

 

錯誤代碼1:(註釋裏是我自己寫的,測試點1、3不對)

#include<bits/stdc++.h>
using namespace std;

int main()
{
    string a,b,s;
    cin>>s>>a>>b;
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    reverse(s.begin(),s.end());
    string ans;
//    string s,a,b;
//    cin>>s>>a>>b;
//    reverse(a.begin(),a.end());
//    reverse(b.begin(),b.end());
//    reverse(s.begin(),s.end());
//    int l,l1,l2;
//    l1=a.length();
//    l2=b.length();
//    if(l1>l2)
//       for(int i=0;i<l1-l2;i++)
//            b='0'+b;
//    else
//        for(int i=0;i<l2-l1;i++)
//            a='0'+a;
    while(a.length()!=b.length())
    {
        if(a.length()>b.length())
            b += '0';
        else
            a += '0';
    }

    int j=0,w=0,r=0,num;        //r進位,j進制,w結果,num暫存和
    char c;
//    string ans;
//    for(int i=0;i<l1;i++)
//    {
//        if(i>s.length()-1||s[i]=='0') j=10;      //數制有可能比加數位少
//        else j=s[i]-'0';
//        num=a[i]-'0'+b[i]-'0'+r;
//        w=num%j;
//        r=num/j;
//        c=w+'0';
//        ans=c+ans;
//    }
//    if(r!=0){c=r+'0';ans=c+ans;}
    for(int i=0;i<a.length();i++)
    {
        num = a[i]-'0'+b[i]-'0'+r;
        if(i>s.length()-1 || s[i]=='0')
            j=10;
        else
            j=s[i]-'0';
        r = num/j;
        num %= j;
        ans = (char)(num + '0') + ans;
    }
//    if(r > 0)
//        ans = (char)(num + '0') + ans;
//    int i=0;
//    while(ans[i]=='0')
//        i++;
//    if(i==ans.length()){ cout<<0; return 0;}
//    for(int j=i;j<ans.length();j++)
//        cout<<ans[j];
    int count = 0;
    while(ans[count] == '0' && ans.length() > 1)
        ans.erase(count, 1);
    cout<<ans<<endl;
    return 0;

}

 錯誤代碼2:(改的幾乎除了變量一模一樣了還是錯,測試點1、3

//#include<bits/stdc++.h>
//using namespace std;
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string a,b,s;
    cin>>s>>a>>b;
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    reverse(s.begin(),s.end());
    string xxx;
    
    int num,j,r=0;
    while(a.length()!=b.length())
    {
        if(a.length()>b.length())
            b += '0';
        else
            a += '0';
    }

 //   int j=0,w=0,r=0,num=0;        //r進位,j進制,w結果,num暫存和
 //   char c;
    for(int i=0;i<a.length();i++)
    {
        num = a[i]-'0'+b[i]-'0'+r;
        if(i>s.length()-1 || s[i]=='0')
            j=10;
        else
            j=s[i]-'0';
        r = num/j;
        num %= j;
        xxx = (char)(num + '0') + xxx;
    }
     if(r > 0)
        xxx = (char)(r + '0') + s;

    int count = 0;
    while(xxx[count] == '0' && xxx.length() > 1)
        xxx.erase(count, 1);
    cout<<xxx<<endl;
 //   return 0;
}

正確版:(源於https://www.cnblogs.com/tonyyy/p/10495007.html 

#include <bits/stdc++.h>
using namespace std;
int main()
{
    string a,b,c;
    cin>>c>>a>>b;
    reverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    reverse(c.begin(),c.end());
    string s;

    int up=0,sum,k;
    while(a.length()!=b.length())
    {
        if(a.length()>b.length())
            b += '0';
        else
            a += '0';
    }
    for(int i=0;i<a.length();i++)
    {
        sum = a[i]-'0'+b[i]-'0'+up;
        if(i>c.length()-1 || c[i]=='0')
            k=10;
        else
            k=c[i]-'0';
        up = sum/k;
        sum %= k;
        s = (char)(sum + '0') + s;
    }
    if(up > 0)
        s = (char)(up + '0') + s;
    int count = 0;
    while(s[count] == '0' && s.length() > 1)
        s.erase(count, 1);
    cout<<s<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章