# String Manipulation# Mapping# Conditional Logic

f824 - 算數打油詩-加法

🔗 前往 ZeroJudge 原題

題目描述

題目要求解析包含漢字數字的加法算式,並輸出結果。輸入為包含三個漢字的字串,第一個和第三個漢字代表 1 到 10 的數字,第二個漢字代表加法運算符號「有」或「又」。如果第二個漢字不是「有」或「又」,則輸出「謬」。

解題思路

程式碼使用兩個字串 ktans 來建立漢字數字與整數之間的映射關係。k 儲存了數字的個位數和十位數的漢字表示,tans 儲存了 0 到 20 的數字的漢字表示。程式碼首先遍歷輸入字串的前兩個漢字,找到第一個數字。然後檢查第二個漢字是否為「有」或「又」。如果不是,則輸出「謬」。如果第二個漢字是「有」或「又」,則程式碼繼續遍歷輸入字串的後兩個漢字,找到第二個數字。最後,程式碼將兩個數字相加,並使用 tans 字串輸出結果。

複雜度分析

  • 時間複雜度: O(1)
  • 空間複雜度: O(1)

程式碼

//big-5
#include <iostream>
using namespace std;
string k = "一二三四五六七八九十有又";
string tans[21]={"零","一","二","三","四","五","六","七","八","九","十","十一","十二","十三","十四","十五","十六","十七","十八","十九","二十"};
int mp[12][2];
int main(){
	string a;
	for(int i=0;i<12;++i){
		mp[i][0]=k[i*2];
		mp[i][1]=k[i*2+1];
	}
	while(cin >> a){
		int ans=0,s=0;
		for(int j=0;j<10;++j){
			if(a[0]==mp[j][0]&&a[1]==mp[j][1]){
				ans+=j+1;
				break;
			}
		}
		for(int j=10;j<12;++j){
			if(a[2]==mp[j][0]&&a[3]==mp[j][1]){
				s=1;
				break;
			}
		}
		for(int j=0;j<10;++j){
			if(a[4]==mp[j][0]&&a[5]==mp[j][1]){
				ans+=j+1;
				break;
			}
		}
		if(s){
			cout << tans[ans] << "\n";
		}
		else{
			cout << "謬\n";
		}
	}
}

Discussion