f824_2 - Error
題目描述
題目要求讀取一個字串,該字串代表一個中文數字,並判斷該數字是否為有效的「十、十一、十二」形式。如果字串符合格式,則輸出對應的中文數字;否則,輸出 "謬"。
解題思路
程式碼使用了一個查找表 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";
}
}
}