題的目標很簡單,就是求兩個正整數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:
? + ? = ?
Note:一開始我定義兩個數組來分別讀取 A 和 B,但是發現這樣子的話處理不了中間的空格。所以選用一個字符數組,以碰到的第一個空格爲分界線,這樣就好做多了。但是我這個程序有個 bug 我現在解決不了。就是當 A 或 B 是空字符串時輸出的是錯誤的結果,等以後再來處理吧,也應該是題目測試用例的 bug。
#include <stdio.h>
#include <string.h>
int main()
{
char S[100001];
gets(S);
int a = 0, b = 0, flagA = 0, flagB = 0;
int l = strlen(S), space;
for (int i = 0; S[i] != '\0'; i++) { // 找第一個空格
if (S[i] == ' ') {
space = i; // 記錄第一個空格的位置並跳出循環
break;
}
}
for (int i = 0; i < space; i++) { // 空格前爲 A 串
if (S[i] >= '0' && S[i] <= '9')
a = a * 10 + (S[i] - '0');
else { // 碰到特殊字符做個標記然後跳出循環
flagA = 1;
break;
}
if (a < 1 || a > 1000) flagA = 1; // A 不合法做個標記
}
for (int i = space + 1; i < l; i++) { // 空格後爲 B 串
if (S[i] >= '0' && S[i] <= '9')
b = b * 10 + (S[i] - '0');
else {
flagB = 1;
break;
}
if (b < 1 || b > 1000) flagB = 1;
}
if (!flagA && !flagB) printf("%d + %d = %d", a, b, a + b);
if (!flagA && flagB) printf("%d + ? = ?", a);
if (flagA && !flagB) printf("? + %d = ?", b);
if (flagA && flagB) printf("? + ? = ?");
}
自己試着不要看把代碼碼出來哦,測試樣例可以直接複製,加油小fo汁,爲了更美好的未來呢~~~