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:
? + ? = ?
考點:
1.對char數組的操作:char數組轉int數值的手工模擬
2.各種細小到噁心的點
(1)數字要1到1000的正整數
(2)用第一個出現的空格用來判斷A和B,但沒說A是否存在,也就是說A是可以不存在的
(3)接上一點,第一個空格用來判斷,也就是說第一個空格以後的全部都是B
(4)A和B不能出現除數字外的任何東西,包括空格
3.控制住自己不要砸桌子
#include <iostream>
#include <cstring>
using namespace std;
const int inf=0x3f3f3f3f;
char a[10005];//讀入數據a
char s1[15],s2[15];//char數組代表的A和B
int cnt1=0,cnt2=0;//A,B的長度
int A,B;//A,B的值
int f(char x[],int cnt)//char數組轉int函數
{
int sum=0;//轉int的最後返回值
int quan=1;//每一位的權值
if(cnt==0 || cnt>4)return inf;//沒有值或者大於4位直接return(因爲是1到1000嘛)
for(int i=0;i<cnt;i++)
{
if(x[i]>='0' && x[i]<='9')
{
//從個位開始,累乘10,這是char數組轉int的關鍵代碼
sum+=quan*(x[cnt-i-1]-'0');
quan*=10;
}
else return inf;//只要出現非數字就return
}
if(sum<1 || sum>1000) return inf;
return sum;
}
int main()
{
scanf("%[^\n]",a);//讀入一行
getchar();//喫回車
int flag=1;//判斷第一個空格
for(int i=0;i<strlen(a);i++)
{
if(flag)
{
if(a[i]==' ')flag=0;//第一個空格是表示A還是B
else s1[cnt1++]=a[i];
}
else
{
s2[cnt2++]=a[i];
}
}
//只要返回inf,你就是錯誤的
A=f(s1,cnt1);
B=f(s2,cnt2);
if(A==inf && B==inf)
printf("? + ? = ?");
if(A!=inf && B==inf)
printf("%d + ? = ?",A);
if(A==inf && B!=inf)
printf("? + %d = ?",B);
if(A!=inf && B!=inf)
{
int c=A+B;
printf("%d + %d = %d",A,B,c);
}
}
我是Acmer菜雞GuoX,有空下次再見