日にちの素因数分解

x 月 y 日を z = 100 * x + y と表現したとき、z の約数の個数が最も多くなるような x と y を求めよ。

この問題を解いてくれた物理の後輩に感謝。答えはふたつあるそうです。

勘で解いたら間違えていたよ.仕方がないのでまたもコンピュータを使ったよ.最後に出力とソースを載せておくから暇な人は見るがいいよ.でも

    static boolean ifPrime(int n){ // n<37
	switch(n){
	case 2:case 3:case 5:case 7:case 11:case 13:case 17:case 19:
	case 23:case 29:case 31: return true;
	default: return false;
	}
    }

これはひどいと自分でも思う.だけどさ,ここで

	for(int i=2;i<=Math.sqrt(n);i++) if(n%i==0) return false; return true;

とかやるの無駄だし.11 個しかないんだからリスト作っちゃえばいいじゃん.

ということで暇人用にリンク & コピペ.暇で Java コンパイラ持ってる人は自己責任で実行してみるもよいよ.
http://melvy.hp.infoseek.co.jp/misc/CalendarMeasure_result.txt
http://melvy.hp.infoseek.co.jp/misc/CalendarMeasure.java

   |  1  2  3  4  5  6  7  8  9 10 11 12
---+------------------------------------
 1 |  2  4  4  2  4  2  2  6  4  8  4  2
 2 |  8  4  4  8  4  8 16  4  8  8  8  4
 3 |  2  4  4  4  2  6  4  4  8  4  2  4
 4 |  8 12 10  6 24  6 14 12  8  6 20 12
 5 |  8  4  4 10  4  6  8  8  4  8  8  4
 6 |  4  4 12  8  8  8  4  8  8  4  8 12
 7 |  2  6  2  4  6  2  4  4  2  4  8  4
 8 | 12 10 12 16  6 12 12  8  6 30  6  8
 9 |  2  4  4  2  2  8  2  2  6  2  2  8
10 |  8 16  8  8 16  8  8 20 16  8 16 12
11 |  4  2  2  4  4  4  6  2  2  4  4  4
12 | 10  6 16  6 10 18  8 12 20 12  8 12
13 |  2  4  2  4  8  2  4  4  4  2  8  2
14 |  8  4  4 12  4  4 16  8  4 12  4  4
15 |  4  4 12  4  4  8  8  4  8  8  4 12
16 |  6 16  6 12 12 16  6 20  6  8 18 14
17 |  6  4  2  4  4  2  4  4  4  6  2  2
18 |  4  4  8  8  8  8  4  4 16  4  8 16
19 |  4  4  4  2  4  2  2 12  2  2  4  4
20 | 16 12 14 24 16 12 30 12 16 24 24 12
21 |  3  4  4  2  2  8  4  2  4  2  4  8
22 |  4  8  8  4 12  4  6  8  4  8 16  8
23 |  4  2  4  6  2  4  4  2  4  8  2  2
24 |  6 12 15  8  6 20  6  8 24 11  6 24
25 |  4  9  6  6 12  5  6 12  6  6 12  9
26 | 12  4  4  8  4  4 12  8  4 16  4  4
27 |  2  2  4  4  4  8  2  2  6  4  6  4
28 |  8 12  8  6 20  6 16 18 12  6 16  6
29 |  4  2  4  8  3  4  7  2  2  8  2  2
30 |  8    16  8  8 24  8  8 16  8  8 16
31 |  2     2     6     4  4     2     2
class CalendarMeasure{
    public static void main(String args[]){
	int x,y,i,j,tmp,nm;
	System.out.println("   |  1  2  3  4  5  6  7  8  9 10 11 12");
	System.out.println("---+------------------------------------");
	for(y=1;y<=31;y++){
	    if(y<10) System.out.print(" "+y+" |");
	    else System.out.print(y+" |");
	    for(x=1;x<=12;x++){
		tmp = x*100+y;
		nm = 1;
		for(i=2;i<=Math.sqrt(tmp);i++){
		    if(ifPrime(i)){
			for(j=1;;j++){
			    if(tmp%i==0) tmp /= i;
			    else break;
			}
			nm *= j;
		    }
		}
		if(tmp!=1) nm *= 2;
		if(y>maxDay(x)) System.out.print("   ");
		else if(nm<10) System.out.print("  "+nm);
		else System.out.print(" "+nm);
	    }
	    System.out.println();
	}
    }
    static int maxDay(int n){
	switch(n){
	case 1:case 3:case 5:case 7:case 8:case 10:case 12: return 31;
	case 4:case 6:case 9:case 11: return 30;
	case 2: return 29;
	default: return -1;
	}
    }
    static boolean ifPrime(int n){ // n<37
	switch(n){
	case 2:case 3:case 5:case 7:case 11:case 13:case 17:case 19:
	case 23:case 29:case 31: return true;
	default: return false;
	}
    }
}

載せてみたらほんとに無駄だった.