L1-025 正整數A+B (15 分)團體程序設計天梯賽-練習集-ExtraGuoX

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,有空下次再見在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章