# String Manipulation# Lookup Table

f824_2 - Error

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一個字串,該字串代表一個中文數字,並判斷該數字是否為有效的「十、十一、十二」形式。如果字串符合格式,則輸出對應的中文數字;否則,輸出 "謬"。

解題思路

程式碼使用了一個查找表 mp 來儲存中文數字的表示形式。它首先定義了一個包含中文數字的字串 k 和一個包含中文數字名稱的字串陣列 tans。然後,它遍歷輸入字串,使用查找表 mp 查找字串的前三個字元和後三個字元對應的數字。如果找到匹配的數字,則將它們加總,並檢查字串的第四到第六個字元是否表示 "十"、"十一" 或 "十二"。如果字串格式正確,則輸出對應的中文數字名稱;否則,輸出 "謬"。

複雜度分析

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

程式碼

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

Discussion