f(1,10)^2以上

Loop


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());