1. 程式人生 > 實用技巧 >PTA正整數A+B

PTA正整數A+B

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

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

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

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

輸入樣例1:
123 456
輸出樣例1:
123 + 456 = 579
輸入樣例2:
22. 18
輸出樣例2:
? + 18 = ?
輸入樣例3:
-100 blabla bla...33
輸出樣例3:
? + ? = ?

我們可以利用兩個字元陣列分別儲存空格前後的字串,然後設定兩個標記fa和fb,判斷是否為題目給出的合法整數。
這裡有一個坑,就是題目可能給出多個空格,如果空格挨在第一個空格後面的話,使用scanf("%s %s",A,B)就不能讀取到第二個空格了。所以要先用getchar函式吃掉一個空格,然後再使用cin.getline來獲得第一個空格後面的所有字串,這樣就可以將第二個空格讀取到了。

程式碼實現如下

#include <iostream>
using namespace std;

char A[20], B[20];

int main(){
    int a = 0, b = 0;
    int fa = 1, fb = 1;
    scanf("%s", &A);
    getchar();
    cin.getline(B, 100);
    for(int i = 0; A[i] != '\0'; i++)
        if(A[i] < '0' || A[i] > '9'){
            fa = 0;
            break;
        }
    for(int i = 0; B[i] != '\0'; i++)
        if(B[i] < '0' || B[i] > '9'){
            fb = 0;
            break;
        }
    if(fa){
        for(int i = 0; A[i] != '\0'; i++)
            a = a * 10 + (A[i] - '0');
        if(a < 1 || a > 1000) fa = 0;
    }
    if(fb){
        for(int i = 0; B[i] != '\0'; i++)
            b = b * 10 + (B[i] - '0');
        if(b < 1 || b > 1000) fb = 0;
    }
    if(fa && fb) printf("%d + %d = %d", a, b, a+b);
    else if(fa) printf("%d + ? = ?", a);
    else if(fb) printf("? + %d = ?", b);
    else printf("? + ? = ?");
    return 0;
}