分类:其他 难度:1.5
题意:将一个数各个位的和,与因式分解的每个因数各个位的和,如相等,为smith数,4937775= 3*5*5*65837,4+9+3+7+7+7+5= 42, 3+5+5+6+5+8+3+7=42。求大于给出的n的最小smith数。因式分解,map记录因式分解结果,map[因数]=出现次数。
#include<cstdio>
#include<map>
using namespace std;
map<int,int>::iterator it;
int numsum(int a)
{
int ans=0;
for(;a;a/=10)
{
ans += a%10;
}
return ans;
}
int facsum(int a)
{
int i,sum=0;
map<int,int> fac;
int b=a;
for(i=2; i*i<=b; i++)
{
if(b%i==0)
{
while(b%i==0)
{
it=fac.find(i);
if(it == fac.end())
{
fac[i] = 1;
}
else
{
fac[i]++;
}
b /= i;
}
}
}
if(b == a) return 0;
if(b > 1) fac[b] = 1;
for(it=fac.begin(); it!=fac.end(); it++)
{
sum += numsum(it->first) * it->second;
}
return sum;
}
bool check(int a)
{
int sum1 = numsum(a);
int sum2 = facsum(a);
//printf("%d %d %d\n",a,sum1,sum2);
if(sum1 == sum2)
return true;
return false;
}
int main()
{
int a;
while(scanf("%d",&a) && a>0)
{
while(1)
{
a++;
if(check(a))
{
printf("%d\n",a);
break;
}
}
}
}