POJ 1142 Smith Numbers
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 10002 | Accepted: 3512 |
Description
The sum of all digits of the telephone number is 4+9+3+7+7+7+5= 42,and the sum of the digits of its prime factors is equally 3+5+5+6+5+8+3+7=42. Wilansky was so amazed by his discovery that he named this kind of numbers after his brother-in-law: Smith numbers.
As this observation is also true for every prime number, Wilansky decided later that a (simple and unsophisticated) prime number is not worth being a Smith number, so he excluded them from the definition.
Wilansky published an article about Smith numbers in the Two Year College Mathematics Journal and was able to present a whole collection of different Smith numbers: For example, 9985 is a Smith number and so is 6036. However,Wilansky was not able to find a Smith number that was larger than the telephone number of his brother-in-law. It is your task to find Smith numbers that are larger than 4937775!
Input
Output
Sample Input
4937774 0
Sample Output
4937775
Source
#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;
bool hash[10000];
bool is_p(int &n)
{
int i,m=sqrt(double(n));
for(i=3;i<=m;i+=2)
if(n%i==0)
return false;
return true;
}
int digit(int n)
{
int sum=0;
while(n)
{
sum+=n%10;
n=n/10;
}
return sum;
}
int rc[1300],l;
int main()
{
int i,j;
for(i=4;i<10000;i+=2)
hash[i]=1;
for(i=3;i<10000;i+=2)
if(is_p(i))
for(j=i+i;j<10000;j+=i)
hash[j]=1;
j=0;
for(i=2;i<10000;i++)
if(!hash[i])
rc[j++]=i;
l=j;
//printf("%d\n",j);
int n,te;
int ds,pfds;
while(scanf("%d",&n),n)
{
if(n==1) {printf("4\n");continue;}//开始把这写成2了、、、素数本身不算
while(n++)
{
if(n%2&&is_p(n))
continue;
ds=digit(n);
pfds=0;
i=0;
te=n;
while(te!=1)
{
while(te%rc[i]==0)
{
pfds+=digit(rc[i]);
te=te/rc[i];
}
i++;
if(te>1&&is_p(te)) {pfds+=digit(te);break;}
}
if(ds==pfds)
{
printf("%d\n",n);
break;
}
}
}
return 0;
}