P_E_17
とか何とか言って(16番の続き),17番.
one, two, three...one thousandまでの文字数をカウント.
うっわ,ひどい.問題も,僕のコードも.
natural f17() { natural sum = 0; map<int, int> lnum; map<int, int> part; part.insert(make_pair(1, 3)); //one part.insert(make_pair(2, 3)); //two part.insert(make_pair(3, 5)); //three part.insert(make_pair(4, 4)); //four part.insert(make_pair(5, 4)); //five part.insert(make_pair(6, 3)); //six part.insert(make_pair(7, 5)); //seven part.insert(make_pair(8, 5)); //eight part.insert(make_pair(9, 4)); //nine part.insert(make_pair(10, 3)); //ten part.insert(make_pair(11, 6)); //eleven part.insert(make_pair(12, 6)); //twelve part.insert(make_pair(13, 8)); //thirteen part.insert(make_pair(14, 8)); //fourteen part.insert(make_pair(15, 7)); //fifteen part.insert(make_pair(16, 7)); //sixteen part.insert(make_pair(17, 9)); //seventeen part.insert(make_pair(18, 8)); //eighteen part.insert(make_pair(19, 8)); //nineteen part.insert(make_pair(20, 6)); //twenty part.insert(make_pair(30, 6)); //thirty part.insert(make_pair(40, 5)); //forty part.insert(make_pair(50, 5)); //fifty part.insert(make_pair(60, 5)); //sixty part.insert(make_pair(70, 7)); //seventy part.insert(make_pair(80, 6)); //eighty part.insert(make_pair(90, 6)); //ninety part.insert(make_pair(100, 7)); //hundred part.insert(make_pair(1000, 8)); //thousand for(int i=1; i<1000; ++i) { int lettercount = 0; int num = i; int hundred = num / 100; num%=100; int ten = num / 10 * 10; num%=10; int one = num; if(ten == 10) //10 ~ 19 { lettercount += part.find(ten + one)->second; } else if(one) { if(ten){ //20 ~ 99 lettercount += part.find(ten)->second; lettercount += part.find(one)->second; } else { //01 ~ 09 lettercount += part.find(one)->second; } } else if(ten) { //10 ~ 90 :step 10 lettercount+= part.find(ten)->second; } if(hundred){ if(ten || one) { // "3" means the count of "and" lettercount += part.find(hundred)->second + part.find(100)->second + 3; } else { lettercount += part.find(hundred)->second + part.find(100)->second; } } sum+= lettercount; } sum+= part.find(1)->second + part.find(1000)->second; return sum; }
どうしても,何と言うか一般的なとき方をしにくい.thirteen とか,thirtyをthirとteen / tyに分割するとかはありえるが,
別にそこまでしなくていいか,という感じで適当にやってしまった.もはや指折り数えているのと大差なくて切ない.
と思ったらフォーラムでは大体同じような解き方をしている人が大半みたいなのでまあいいか.