# String Parsing# Basic Arithmetic# Input Validation

e659 - 11878 - Homework Checker

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取多行字串,每行字串代表一個數學題目,格式為 "a + b = c" 或 "a - b = c"。其中 a 和 b 是非負整數且不超過 100,c 是一個非負整數且不超過 200,或者是一個問號 "?"。程式需要計算弟弟答對的題目數量,並輸出這個數量。

解題思路

程式的主要邏輯是逐行讀取輸入字串,然後解析字串中的數字和運算符號。對於每一行輸入,程式首先提取數字 a、運算符號 c 和數字 b。然後,根據運算符號,計算 a 和 b 的結果,並將其與 c 進行比較。如果計算結果與 c 相同,則將答案計數器加一。最後,程式輸出答案計數器。

程式使用迴圈逐個字符地解析輸入字串。它使用條件判斷來判斷字符是數字還是運算符號。當遇到數字時,程式將其轉換為整數並累加到相應的變數中。當遇到運算符號時,程式記錄下運算符號,並繼續解析後面的數字。

複雜度分析

  • 時間複雜度: O(N*M),其中 N 是輸入行數,M 是每行字串的長度。因為程式需要逐行讀取輸入,並逐個字符地解析字串。
  • 空間複雜度: O(1),程式只使用了少數幾個變數來存儲數字和運算符號,因此空間複雜度是常數級別。

程式碼

#include <iostream>
#include <string>
using namespace std;
int main(){
	string a;
	int ans=0;
	while(getline(cin,a)){
		int al=a.length();
		int x=0,y=0,z=0,i;
		char c;
		for(i=0;;i++){
			if(a[i]>='0'&&a[i]<='9'){
				x*=10;
				x+=a[i]-48;
			}
			else{
				c=a[i];
				i++;
				break;	
			}
		}
		for(;;i++){
			if(a[i]>='0'&&a[i]<='9'){
				y*=10;
				y+=a[i]-48;
			}
			else{
				i++;
				break;	
			}
		}
		for(;;i++){
			if(a[i]>='0'&&a[i]<='9'){
				z*=10;
				z+=a[i]-48;
			}
			else
				break;	
		}
		if(c=='+'){
			if(x+y==z){
				ans++;
			}
		}
		else if(c=='-'){
			if(x-y==z){
				ans++;
			}
		}
	}
	cout << ans << "\n";
}

Discussion