POJ 1142 Smith Numbers

Smith Numbers
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 10002   Accepted: 3512

Description

While skimming his phone directory in 1982, Albert Wilansky, a mathematician of Lehigh University,noticed that the telephone number of his brother-in-law H. Smith had the following peculiar property: The sum of the digits of that number was equal to the sum of the digits of the prime factors of that number. Got it? Smith's telephone number was 493-7775. This number can be written as the product of its prime factors in the following way:
4937775= 3*5*5*65837

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

The input file consists of a sequence of positive integers, one integer per line. Each integer will have at most 8 digits. The input is terminated by a line containing the number 0.

Output

For every number n > 0 in the input, you are to compute the smallest Smith number which is larger than n,and print it on a line by itself. You can assume that such a number exists.

Sample Input

4937774

0

Sample Output

4937775

Source

//纠结的、本来是简单题、唉,
//WA、了好多次

#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;
}

你可能感兴趣的:(number)