藍橋杯 基礎練習 數的讀法 【模擬】
時間限制:1.0s 記憶體限制:512.0MB
提交此題 錦囊1 錦囊2
問題描述
Tom教授正在給研究生講授一門關於基因的課程,有一件事情讓他頗為頭疼:一條染色體上有成千上萬個鹼基對,它們從0開始編號,到幾百萬,幾千萬,甚至上億。
比如說,在對學生講解第1234567009號位置上的鹼基時,光看著數字是很難準確的念出來的。
所以,他迫切地需要一個系統,然後當他輸入12 3456 7009時,會給出相應的念法:
十二億三千四百五十六萬七千零九
用漢語拼音表示為
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
這樣他只需要照著念就可以了。
你的任務是幫他設計這樣一個系統:給定一個阿拉伯數字串,你幫他按照中文讀寫的規範轉為漢語拼音字串,相鄰的兩個音節用一個空格符格開。
注意必須嚴格按照規範,比如說“10010”讀作“yi wan ling yi shi”而不是“yi wan ling shi”,“100000”讀作“shi wan”而不是“yi shi wan”,“2000”讀作“er qian”而不是“liang qian”。
輸入格式
有一個數字串,數值大小不超過2,000,000,000。
輸出格式
是一個由小寫英文字母,逗號和空格組成的字串,表示該數的英文讀法。
樣例輸入
1234567009
樣例輸出
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
題意: 略
分析: 這種模擬題得多做,才能切的快,這道題整整做了近四十分鐘呀,太慢啦,思路很好像,範圍就到2e9,簡單來說就是分3段,第一段是億前面的,第二段為千萬級的,第三段為不到一萬的,map預處理下,這道題難考慮的地方就是“零”,零的地方每個得考慮到,簡要如下:①,杜絕連續幾個零。②,當上一個為十位時,零該不該放。③結尾出現零時怎麼處理等,還有一點時,當開頭是12這種情況,應該把yi省略,直接讀成“shi er“其餘的都好說,程式碼有點亂QWQ
#include<bits/stdc++.h>
using namespace std;
map<char,string> m1;
map<int,string> m2;
void init() {
m1['0'] = "ling";m1['1'] = "yi";m1['2'] = "er";
m1['3'] = "san";m1['4'] = "si";m1['5'] = "wu";
m1['6'] = "liu";m1['7'] = "qi";m1['8'] = "ba";
m1['9'] = "jiu";
m2[1 ] = "shi";
m2[2] = "bai";
m2[3] = "qian";
m2[4] = "wan";
m2[5] = "yi";
}
int main(){
init();
vector<string> res;
string s;cin>>s;
int len = s.size();
string s1,s2,s3;
if(len > 8) {
s1 = s.substr(0,len-8);
s2 = s.substr(len-8,4);
s3 = s.substr(len-4,4);
} else if(len > 4) {
s2 = s.substr(0,len-4);
s3 = s.substr(len-4,4);
} else {
s3 = s.substr(0,len);
}
if(s1.size() > 0) {
for(int i = 0;i < s1.size();i++) {
string t = m1[s1[i]];
if(res.size() > 0 && t == "ling") {
if(res.back() == "ling" || res.back() == "shi" || res.back() == "bai" || res.back() == "qian")
continue;
}
res.push_back(m1[s1[i]]);
res.push_back(m2[s1.size() - i - 1]);
}
res.push_back(m2[5]);
}
if(s2.size() > 0) {
for(int i = 0;i < s2.size();i++) {
string t = m1[s2[i]];
if(res.size() > 0 && t == "ling") {
if(res.back() == "ling" || res.back() == "shi" )
continue;
}
res.push_back(m1[s2[i]]);
if(res.back() != "ling")
res.push_back(m2[s2.size() - i - 1]);
}
if(res.back() != "ling")
res.push_back(m2[4]);
}
if(s3.size() > 0) {
for(int i = 0;i < s3.size();i++) {
string t = m1[s3[i]];
if(res.size() > 0 && t == "ling") {
if(res.back() == "ling" || res.back() == "shi" )
continue;
}
res.push_back(m1[s3[i]]);
if(res.back() != "ling")
res.push_back(m2[s3.size() - i - 1]);
}
}
while (res[res.size() - 1] == "ling") {
res.pop_back();
}
if(res[0] == "yi" && res[1] == "shi") {
for(int i = 1;i < res.size();i++) {
cout<<res[i];
if(i == res.size() - 1)
putchar('\n');
else putchar(' ');
}
} else {
for(int i = 0;i < res.size();i++) {
cout<<res[i];
if(i == res.size() - 1)
putchar('\n');
else putchar(' ');
}
}
return 0;
}
- 如有錯誤或遺漏,請私聊下UP,thx
相關推薦
藍橋杯 基礎練習 數的讀法 【模擬】
時間限制:1.0s 記憶體限制:512.0MB 提交此題 錦囊1 錦囊2 問題描述 Tom教授正在給研究生講授一門關於基因的課程,有一件事情讓他頗為頭疼:一條染色體上有成千上萬個鹼基對,它們從0開始編號,到幾百萬,幾千萬,甚至上億。
藍橋杯 基礎練習 數的讀法
基礎練習 數的讀法 時間限制:1.0s 記憶體限制:512.0MB 問題描述 Tom教授正在給研究生講授一門關於基因的課程,有一件事情讓他頗為頭疼:一條染色體上有成千上萬個鹼基對,它們從0開始編號,到幾百萬,幾千萬,甚至上億。 比如說,在對學生講解第12
藍橋杯 歷屆試題 分糖果 【模擬】
歷屆試題 分糖果 時間限制:1.0s 記憶體限制:256.0MB 問題描述 有n個小朋友圍坐成一圈。老師給每個小朋友隨機發偶數個糖果,然後進行下面的遊戲: 每個小朋友
藍橋杯 基礎練習 特殊回文數
pan void system ali i++ 數據 util new style /*基礎練習 特殊回文數問題描述 123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。 輸入一個正整數n, 編程求所有這樣的五位和六位十進制數,滿足各位數字之和等於n 。輸入格
藍橋杯 基礎練習 特殊迴文數
問題描述 123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。 輸入一個正整數n, 程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 。 輸入格式 輸入一行,包含一個正整數n。 輸出格式 按從小到大的順序輸出滿足條件的整數
藍橋杯 基礎練習 BASIC-9 特殊迴文數 迴文數 迴圈 條件語句
基礎練習 特殊迴文數 時間限制:1.0s 記憶體限制:512.0MB 問題描述 123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。 輸入一個正整數n, 程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 。 輸入格式 輸入一行,包含一個正整數n。
"藍橋杯“基礎練習:特殊迴文數
問題描述 123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。 輸入一個正整數n, 程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 。 輸入格式 輸入
藍橋杯 基礎練習 2n皇后問題【DFS + 回溯】
時間限制:1.0s 記憶體限制:512.0MB 問題描述 給定一個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同
藍橋杯基礎練習 階乘計算(簡單模擬)
基礎練習 階乘計算 時間限制:1.0s 記憶體限制:512.0MB 問題描述 輸入一個正整數n,輸出n!的值。 其中n!=1*2*3*…*n。 演算法描述
藍橋杯 基礎練習之BASIC-8迴文數(c語言實現)
/* 問題描述 1221是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的,程式設計求所有這樣的四位十進位制數。 輸出格式 按從小到大的順序輸出滿足條件的四位十進位制數。 */ #include<stdio.h> int main() { int
藍橋杯 基礎練習 特殊迴文數 高效演算法
基礎練習 特殊迴文數 時間限制:1.0s 記憶體限制:512.0MB 問題描述 123321是一個非常特殊的數,它從左邊讀和從右邊讀是一樣的。 輸入一個正整數n,
藍橋杯基礎練習---矩陣乘法
cst ans 時間限制 str 絕對值 忘記 個數 clu 表示 基礎練習 矩陣乘法 時間限制:1.0s 內存限制:512.0MB 錦囊1 錦囊2 錦囊3 問題描述 給定一個N
藍橋杯 基礎練習 BASIC-12 十六進制轉八進制
info div for 限制 class 輸入 字符 字母 res 基礎練習 十六進制轉八進制 時間限制:1.0s 內存限制:512.0MB 問題描述 給定n個十六進制正整數,輸出它們對應的八進制數。輸入格式 輸入的第一行為一個正整數n (1<=n
藍橋杯-基礎練習 :java 數列排序問題
repl 給定 can .cn turn exti color 問題 http 問題描述 給定一個長度為n的數列,將這個數列按從小到大的順序排列。1<=n<=200 輸入格式 第一行為一個整數n。 第二行包含n個整數,為待排序的數,每個整數的絕對值小
藍橋杯- 基礎練習: 字母圖形
alt gpo pan 圖片 -- ext .com color ack import java.util.Scanner; public class W { /* A B C D E F G B A B C D E F C B A B C D E D C B A
藍橋杯 基礎練習 十六進制轉八進制
spa tro rgs number 解決 ann ret else if ger import java.util.*;public class Main { public static void main(String[] args) { Scann
藍橋杯 基礎練習 十六進制轉十進制
溢出 oid import scan post 文件 ava 轉化 藍橋杯 import java.util.*;public class Main { public static void main(String[] args) { Scanner s
藍橋杯 基礎練習 十進制轉十六進制
out pos hex can ati static sca ner 十進制 import java.util.*;public class Main { public static void main(String[] args) { Scanner
藍橋杯 基礎練習 字母圖形
int() [] 基礎練習 tin next can abc out ann /** * 問題描述 利用字母可以組成一些美麗的圖形,下面給出了一個例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 這是一個5行7列的圖形,請找出這個圖形的
藍橋杯基礎練習 完美的代價
iostream div amp sin 移動 第一次 第一個 對稱 個數 問題描述 回文串,是一種特殊的字符串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你一個串,它不一定是回文的,請你計算最少的交換次數使得該串變成一個完美的回文串。 交換