CCCC-L1-025 正整數A+B題解

苗苗發表於2020-11-14

題的目標很簡單,就是求兩個正整數A和B的和,其中A和B都在區間[1,1000]。稍微有點麻煩的是,輸入並不保證是兩個正整數。

輸入格式:

輸入在一行給出A和B,其間以空格分開。問題是A和B不一定是滿足要求的正整數,有時候可能是超出範圍的數字、負數、帶小數點的實數、甚至是一堆亂碼。

注意:我們把輸入中出現的第1個空格認為是A和B的分隔。題目保證至少存在一個空格,並且B不是一個空字串。

輸出格式:

如果輸入的確是兩個正整數,則按格式A + B = 和輸出。如果某個輸入不合要求,則在相應位置輸出?,顯然此時和也是?。

輸入樣例1:

123 456

輸出樣例1:

123 + 456 = 579

輸入樣例2:

  1. 18

輸出樣例2:

? + 18 = ?

輸入樣例3:

-100 blabla bla…33

輸出樣例3:

? + ? = ?

程式碼

#include <bits/stdc++.h>

using namespace std;

int transf(string s)
{
    if(s[0]=='-') return -1;
    int k=s[0]-'0';
    if(k<0||k>9) return -1;
    for(int i=1;i<s.length();i++)
    {
        k=s[i]-'0';
        if(k<0||k>9) return -1;
    }

    stringstream ss;
    ss<<s;
    int x;
    ss>>x;
    if(x>1000||x<1) return -1;
    return x;
}

int main()
{
    string str,str1,str2;
    getline(cin,str);
    int pos=str.find(' ');
    str1=str.substr(0,pos);
    str2=str.substr(pos+1);

    //cout<<str1<<"-"<<str2;
    int a=transf(str1);
    int b=transf(str2);
    if(a==-1) cout<<'?';
    else cout<<a;
    cout<<" + ";

    if(b==-1) cout<<'?';
    else cout<<b;
    cout<<" = ";

    if(a==-1||b==-1) cout<<'?';
    else cout<<a+b;
    return 0;
}

總結

  • 關鍵點1:如何拆分兩個字串。由於題目“我們把輸入中出現的第1個空格認為是A和B的分隔。題目保證至少存在一個空格,並且B不是一個空字串。”,而cin識別字串到空格截止,從空格後繼續識別,導致可能漏掉空格。eg.12 34應該是12 + ? = ?而不是12 + 34 = 46
    故先作為一個字串讀入,然後根據第一個空格的位置進行拆分。
  • 關鍵點2:string向int的轉換
  • 輸出時本來想用a==-1?’?’:a的,編譯報錯。不能把字元給int變數。

相關文章