1. 程式人生 > >PTAL1-025 正整數A+B解題報告---字元處理

PTAL1-025 正整數A+B解題報告---字元處理

                             L1-025 正整數A+B (15 分)

題的目標很簡單,就是求兩個正整數AB的和,其中AB都在區間[1,1000]。稍微有點麻煩的是,輸入並不保證是兩個正整數。

輸入格式:

輸入在一行給出AB,其間以空格分開。問題是AB不一定是滿足要求的正整數,有時候可能是超出範圍的數字、負數、帶小數點的實數、甚至是一堆亂碼。

注意:我們把輸入中出現的第1個空格認為是A

B的分隔。題目保證至少存在一個空格,並且B不是一個空字串。

輸出格式:

如果輸入的確是兩個正整數,則按格式A + B = 和輸出。如果某個輸入不合要求,則在相應位置輸出?,顯然此時和也是?

輸入樣例1:

123 456

輸出樣例1:

123 + 456 = 579

輸入樣例2:

22. 18

輸出樣例2:

? + 18 = ?

輸入樣例3:

-100 blabla bla...33

輸出樣例3:

? + ? = ?

坑點:

第二個輸入可能有空格(題目保證至少存在一個空格),所以我們要用getline去讀入第二個整數以防類似於

輸入:12 + 100 24add

輸出:112

這樣的情況得到(%s不接收空格) 

不然可能一直是13分

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#include<cctype>
#include<map>
#include<string>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int main() {
	char s1[105];
	string s2;
	scanf("%s", s1);
	getchar();
	getline(cin, s2);
	//cin>>s2;
	int len1 = strlen(s1), len2 = s2.length();
	bool flag1 = false, flag2 = false;
	//判斷是否為1到1000範圍,且非負數
	if (len1 > 4 || (len1 == 4 && (s1[0] != '1' || s1[1] != '0' || s1[2] != '0' || s1[3] != '0')) || s1[0] == '-' || (s1[0] == '0' && len1 == 1)) flag1 = true;
	if (len2 > 4 || (len2 == 4 && (s2[0] != '1' || s2[1] != '0' || s2[2] != '0' || s2[3] != '0')) || s2[0] == '-' || (s2[0] == '0' && len2 == 1)) flag2 = true;
	for (int i = 0; i < len1 && !flag1; i++) {
		if (!isdigit(s1[i])) {	//判斷是否全為數字
			flag1 = true;
			break;
		}
	}
	for (int i = 0; i < len2 && !flag2; i++) {
		if (!isdigit(s2[i])) {
			flag2 = true;
			break;
		}
	}
	if (flag1) printf("? + ");
	else printf("%s + ", s1);
	if (flag2) printf("? = ");
	else printf("%s = ", s2.c_str());
	if (flag1 || flag2) printf("?\n");
	else {
		int v1 = 0, v2 = 0;
		for (int i = 0; i < len1; i++) {
			v1 = (s1[i] - '0') + v1 * 10;
		}
		for (int i = 0; i < len2; i++) {
			v2 = (s2[i] - '0') + v2 * 10;
		}
		printf("%d\n", v1 + v2);
	}
	return 0;
}