TopCoder SRM 466 Div1 Easy LotteryCheating

問題

番号のかかれたくじがある。(leading zeroがある場合がある)
このくじは、書かれた数が0または、約数の個数が奇数なら当たりである。


くじの番号を何桁か書き換えて当たりにしたい。
最小で何桁を変えなければならないか、求めよ。

制約条件

くじにかかれた数字の個数≦10

方針

約数の個数が奇数⇔平方数
10桁以下の平方数は、10^5個くらいと少ないので、
全部調べて、いちばん書き換える数が少ないのを求める。


leading zeroに注意する。

ソースコード

class LotteryCheating {
	public:
	int minimalChange(string ID) 
	{
		int n=ID.size(),ans=n;
		ll N=1;
		rep(i,n)N*=10;
		for(ll i=0;i*i<N;i++){
			char buf[20]="0000000000000000",buf2[20];
			sprintf(buf2,"%lld",i*i);
			strcpy(buf+n-strlen(buf2),buf2);
			int cnt=0;
			rep(j,n)if(buf[j]!=ID[j])cnt++;
			ans=min(ans,cnt);
		}
		return ans;
	}
};