f(1,1)からf(1,9)までは以下のとおり
f(1,1)
1
f(1,2)
121
f(1,3)
12321
f(1,4)
1234321
f(1,5)
123454321
f(1,6)
12345654321
f(1,7)
1234567654321
f(1,8)
123456787654321
f(1,9)
12345678987654321
f(1,100)まで計算してみると、どうも「ループって怖くね?」感がある。
だからできるだけ計算しなくていいように作ってみた。
f(1,1)~f(1,9)だけが計算してて、その前後は適当に連結してるだけ。
StringBuilder sb = new StringBuilder(); BigInteger bi = new BigInteger(1); //使う文字列 String top = "123456790"; String bottom = "987654320"; String last = "987654321"; //前部分 int tc = (c - 1) / 9; for (int i = 0; i < tc; i++) { sb.Append(top); } //真ん中部分 int mc = c % 9; if (mc == 0) mc = 9; for (int i = 0; i < mc - 1; i++) { bi = bi * 10 + 1; } sb.Append((bi * bi - ((c < 10) ? 0 : 1)).ToString()); //お尻部分 int bc = (c - 1) / 9; for (int i = 0; i < bc - 1; i++) { sb.Append(bottom); } if(bc != 0) sb.Append(last); return BigInteger.Parse(sb.ToString());