@[始]正整數A+B
作者 | 陳越 |
---|---|
內存限制 | 64 MB |
單位 | 浙江大學 |
時間限制 | 400 ms |
代碼長度限制 | 16 KB |
題的目標很簡單,就是求兩個正整數A和B的和,其中A和B都在區間[1,1000]。稍微有點麻煩的是,輸入並不保證是兩個正整數。但是有一點坑的就是 例如 123 456 ad 輸出結果應該是 123+?= ?,而不是123+456=579。
輸入格式:
輸入在一行給出 A 和 B ,其間以空格分開。問題是 A 和 B 不一定是滿足要求的正整數,有時候可能是超出範圍的數字、負數、帶小數點的實數、甚至是一堆亂碼。
注意:我們把輸入中出現的第1個空格認爲是 A 和 B 的分隔。題目保證至少存在一個空格,並且 B 不是一個空字符串。
輸出格式:
如果輸入的確是兩個正整數,則按格式 A + B = 和 輸出。如果某個輸入不合要求,則在相應位置輸出 ? ,顯然此時和也是 ? 。
輸入樣例1:
123 456
輸出樣例1:
123 + 456 = 579
輸入樣例2:
- 18
輸出樣例2:
? + 18 = ?
輸入樣例3:
-100 blabla bla…33
輸出樣例3:
? + ? = ?
以下是代碼:
/* by --zjy */
#include<bits/stdc++.h> // C++萬能頭文件
using namespace std;
int main()
{
string s,t; // 定義字符串型
int flaga=1,flagb=1,count=0;
int a=0,b=0;
char c;
cin >> s >> t;
c=getchar();
/* 這道題主要是這部分,例如123 456 ad 輸出結果應該是 123+?= ?
所以最後再輸入一個字符判斷是否是換行*/
for(int i=0;i<s.size();i++){
a=10*a+s[i]-'0';
if(isdigit(s[i]))
count++;
if(count==s.size())
flaga=0;
} // 把字符串錄入整型a中,並判斷每個位是否是數字
count=0;
for(int i=0;i<t.size();i++){
b=10*b+t[i]-'0';
if(isdigit(t[i]))
count++;
if(count==t.size())
flagb=0;
}
if(c!='\n')
flagb=1;
if(a<=0 || a>1000) flaga=1;
if(b<=0 || b>1000) flagb=1;
if(flaga==0) printf("%d",a);
else printf("?");
printf(" + ");
if(flagb==0) printf("%d",b);
else printf("?");
printf(" = ");
if(flaga==0 && flagb==0) printf("%d",a+b);
else printf("?");
return 0;
}
這個方法其實很一般,大多數都能夠想到,我朋友提供一種更簡單的方法。
#include<stdio.h>
int main(void){
char str_a[100] = {0}, str_b[100] = {0}, str[100] = {0};
int a = 0,b = 0;
scanf("%s%[^\n]", str_a, str_b); //由樣例3可知第一個空格之後的字符串(包括空格)都爲B串
/* 這裏用了正則表達式更好的處理了我所說的問題。不明白正則的可以去看一下[正則表達式](http://www.runoob.com/regexp/regexp-syntax.html) */
sscanf(str_a,"%d%s", &a, str); //使用sscanf處理字符串,取串中整數。剩下的部分給str
if(a <= 1000 && a >= 1 && str[0] == '\0')//當整數部分符合區間,且str爲空時輸出
printf("%d + ", a); //當str_a符合時
else{
printf("? + "); //當str_a不符合時
a = 0; //將a置零,儲存str_a不符合整數的信息
str[0] = '\0'; //將str[0]置零,防止對str_b進行sscanf取數值後爲空時,str卻不爲空
}//else end
sscanf(str_b,"%d%s", &b, str); //同str_a
if(b <= 1000 && b >= 1 && str[0] == '\0'){
if(a) //當str_a符合,且str_b符合時
printf("%d = %d", b, a+b);
else //當str_a不符合,且str_b符合時
printf("%d = ?", b);
}//if end
else //當str_b符合時
printf("? = ?");
return 0;
}//main end
這種方法更高效,而且代碼更簡潔,如果你有更好的方法,歡迎在下方留言。我們共同進步!希望大家關注我,謝謝。