1から100万まえの数字の読みを辞書順に並べたとき,一番大きいのはどれか?
濁点,半濁点は無視し,小さい仮名は大きい仮名と同じ並び順とする。
「読み方は普通の通りで」って問題にあるが,「普通」って難しい。
7は「しち」,「なな」?
4は「し」,「よん」?
このへんは答えに影響しないし,あまり深刻に考えないことにする。
少し考えると答えが判っちゃうので,判る直前で思考停止。プログラムを組む。
1から100万までの読みを全て作り大きいのが出現するごとに記録する。
先頭が6の数字だけを調べるなんてことはしない。全部調べるんじゃ。
for( int i=1; i<= 1000000; i++) {
iの読みを作り,今までの読みと比較する。
大きければiの読みを記録する。
}
一番大きな読みを出力する。
読みを作るプログラムは以下のようになる。
cstring yomi[][4] = {
{ "" , "" , "" , ""},
{ "いち" , "じゅう" , "ひゃく" , "いっせん"},
{ "に" , "にじゅう" , "にひゃく" , "にせん"},
{ "さん" , "さんじゅう" , "さんびゃく" , "さんぜん"},
{ "よん" , "よんじゅう" , "よんひゃく" , "よんせん"},
{ "ご" , "ごじゅう" , "ごひゃく" , "ごせん"},
{ "ろく" , "ろくじゅう" , "ろっぴゃく" , "ろくせん"},
{ "なな" , "ななじゅう" , "ななひゃく" , "ななせん"},
{ "はち" , "はちじゅう" , "はっぴゃく" , "はっせん"},
{ "きゅう" , "きゅうじゅう" , "きゅうひゃく" , "きゅうせん"},
};
void make_yomi( astring s, int val, int keta)
{
if( val < 0) return;
if( keta==0) {
//strcpy( s, "★");
return;
}
if( keta< 10) {
strcpy( s, yomi[val][0]);
}
else if( keta< 100) {
// 57:ごじゅう なな
strcpy( s, yomi[val/10][1]);
//strcat( s, "◆");
make_yomi( s+strlen(s), val%10, keta/10);
}
else if( keta< 1000) {
// 857:はっぴゃく ごじゅう なな
strcpy( s, yomi[val/100][2]);
//strcat( s, "◆");
make_yomi( s+strlen(s), val%100, keta/10);
}
else if( keta< 10000) {
// 4857:よんせん はっぴゃく ごじゅう なな
strcpy( s, yomi[val/1000][3]);
//strcat( s, "◆");
make_yomi( s+strlen(s), val%1000, keta/10);
}
else if( keta< 100000) {
// 94857:きゅうまん よんせん はっぴゃく ごじゅう なな
strcpy( s, yomi[val/10000][0]);
strcat( s, "まん");
//strcat( s, "◆");
make_yomi( s+strlen(s), val%10000, keta/10);
}
else if( keta< 1000000) {
// 394857:さんじゅう きゅうまん よんせん はっぴゃく ごじゅう なな
strcpy( s, yomi[val/100000][1]);
//strcat( s, "◆");
make_yomi( s+strlen(s), val%100000, keta/10);
}
else if( keta< 10000000) {
// 2394857:にひゃく さんじゅう きゅうまん よんせん はっぴゃく ごじゅう なな
strcpy( s, yomi[val/1000000][2]);
//strcat( s, "◆");
make_yomi( s+strlen(s), val%1000000, keta/10);
}
else if( keta< 100000000) {
// 12394857:せん にひゃく さんじゅう きゅうまん よんせん はっぴゃく ごじゅう なな
strcpy( s, yomi[val/10000000][3]);
//strcat( s, "◆");
make_yomi( s+strlen(s), val%10000000, keta/10);
}
else if( keta< 1000000000) {
// 612394857:ろくおく せん にひゃく さんじゅう きゅうまん よんせん はっぴゃく ごじゅう なな
strcpy( s, yomi[val/100000000][0]);
strcat( s, "おく");
//strcat( s, "◆");
int v = val%100000000;
if( v/10000 == 0) make_yomi( s+strlen(s), v%10000, keta/100000); // 万を飛ばす,これをしないと「さんおくまん」とかになる。
else make_yomi( s+strlen(s), val%100000000, keta/10);
}
}
void make_yomi( astring s, int val)
{
make_yomi( s, val, val);
}
読みを作成後,実際には影響ないけど,問題にあるように,「ぴ」⇒「ひ」,「ぁ」⇒「あ」のように変換してから比較する。
オーメン。
読みを全て生成しているので結構時間が掛かる。
解に影響しないけど,億まで読みに変換できるようにした。
よく考えたら「いっせん」と「せん」は悩むところだな。
ETCを使うと料金は「さんびゃくごじゅうえんです」と声で教えてくれる。ETCを付けるとき,声のあるのと無いのをどちらにしますかと聞かれた。
声で知らせてくれなくたって構わないと思っていたけど,やはり声で教えてくれた方がありがたい。
解速度
Xeon 2.4GHz で3.125秒。