たまに書きます。

気になって調べたことを書いていきます。まずはAboutページをご覧ください。

たけしのコマ大数学科

たけしのコマ大数学科でやってた問題を、番組の時間内にそれを力づくで解くプログラムを書いて正解を出せるかどうかやってみた。

まずは問題から。写したわけじゃないから、文章自体は不正確。

ある二桁の数に、その数の10の位と1の位の数を逆にした数を繰り返し足していく。二桁の数の中で、最もその和が回文数になるのに多くの回数がかかるのはどの数か、求めよ

みたいな感じの問題だった気が。答えは89か98だそうです。
以下、そのソース。変数名も適当だし日本語だし、効率もまったくもって悪い。とりあえず、番組の時間中に書いてみた。

#include <stdio.h>

int main(void)
{
	int cnt;
	int ans_list[101];
	int max;
	int suffix;
	
	/* initialize */
	for(cnt = 0; cnt < 101; cnt++) {
		ans_list[cnt] = 0;
	}

	for(cnt = 10; cnt < 101; cnt++) {
		int kaibun = makereverse(cnt);
		int i = 0;
		int temp = cnt;
		for(i = 0; isKaibunsuu(temp) != 1; i++)
			temp += kaibun;
		ans_list[cnt] = i;
	}

	max = ans_list[0];
	suffix = 0;
	for(cnt = 0; cnt < 101; cnt++) {
		printf("%d => %d\n", cnt, ans_list[cnt]);
		if (max < ans_list[cnt]) {
			suffix = cnt;
			max = ans_list[cnt];
		}
	}
	printf("%d\n", suffix);
	return 0;
}

int makereverse(int src)
{
	int ret = 0;

	while(src / 10 != 0) {
		ret = ret * 10 + src % 10;
		src /= 10;
	}

	ret = ret * 10 + src;
	return ret;
}

int isKaibunsuu(int src)
{
	if (makereverse(src) == src)
		return 1;
	else 
		return 0;
}

検証用も含め、すべての数について表示させてみた。

>./a.out
0 => 0
1 => 0
2 => 0
3 => 0
4 => 0
5 => 0
6 => 0
7 => 0
8 => 0
9 => 0
10 => 1
11 => 0
12 => 1
13 => 1
14 => 1
15 => 1
16 => 1
17 => 1
18 => 1
19 => 3
20 => 1
21 => 1
22 => 0
23 => 1
24 => 1
25 => 1
26 => 1
27 => 1
28 => 10
29 => 1
30 => 1
31 => 1
32 => 1
33 => 0
34 => 1
35 => 1
36 => 1
37 => 10
38 => 1
39 => 10
40 => 1
41 => 1
42 => 1
43 => 1
44 => 0
45 => 1
46 => 7
47 => 1
48 => 7
49 => 7
50 => 1
51 => 1
52 => 1
53 => 1
54 => 1
55 => 0
56 => 1
57 => 3
58 => 3
59 => 45
60 => 1
61 => 1
62 => 1
63 => 1
64 => 3
65 => 1
66 => 0
67 => 12
68 => 34
69 => 12
70 => 1
71 => 1
72 => 1
73 => 34
74 => 1
75 => 4
76 => 7
77 => 0
78 => 2
79 => 45
80 => 1
81 => 1
82 => 5
83 => 1
84 => 56
85 => 56
86 => 2
87 => 6
88 => 0
89 => 3
90 => 1
91 => 9
92 => 1
93 => 2
94 => 9
95 => 3
96 => 3
97 => 9
98 => 4
99 => 0
100 => 1
84

なんだよ、全然違うじゃんw
覚えてたらなおそう、いつかw