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に分割するとかはありえるが,
別にそこまでしなくていいか,という感じで適当にやってしまった.もはや指折り数えているのと大差なくて切ない.


と思ったらフォーラムでは大体同じような解き方をしている人が大半みたいなのでまあいいか.