PTA 正整數A+B(一種新的輸入,正則+易錯樣例)

@[]正整數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:

  1. 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

這種方法更高效,而且代碼更簡潔,如果你有更好的方法,歡迎在下方留言。我們共同進步!希望大家關注我,謝謝。

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