1142 Smith Numbers

問題概要

ある数nがSmith Numberであるとは、
nの各桁の和と、nの素因数全ての各桁の和が等しいことをいう。
ただし、nが素数であるときはnはSmith Numberではないとする。


ある数nが与えられたとき、nより大きな最小のSmith Numberを求めよ。
nは最大で8桁の自然数である。

解法

nより大きな、なのでnは探索範囲に含まれないことに注意。


n+1から順番に素因数分解してSmith Numberかどうかを調べる。
mを素因数分解するのは単純に√m以下の素因数で割れるだけ割るだけでおk.


TLEが厳しいのかと思ったら別にそんなことはなかった。。。

ソースコード

int main()
{
	int n;
	while(scanf("%d",&n),n){
		n++;
		for(;;n++){
			int sum=0,m=n,s=0;
			for(int k=n;k;k/=10)s+=k%10;
			
			for(int i=2;i*i<=m;i++){
				while(m%i==0){
					m/=i;
					for(int k=i;k;k/=10)sum+=k%10;
				}
			}
			if(m==n)continue;
			if(m>1)for(;m;m/=10)sum+=m%10;
			if(sum==s){
				printf("%d\n",n); break;
			}
		}
	}
	return 0;
}