poj1142.Smith Number(数学推导)
Smith Number
Time Limit: 1 Sec Memory Limit: 64 MB Submit: 825 Solved: 366
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 int n ; 3 4 int main () 5 { 6 //freopen ("a.txt" , "r" , stdin ) ; 7 while (~ scanf ("%d" , &n) ) { 8 if (n == 0) 9 break ; 10 while (1) { 11 n ++ ; 12 int x ; 13 int sum = 0 ; 14 int m = n ; 15 while (m) { 16 sum += (m % 10) ; 17 m /= 10 ; 18 } 19 int sum2 = 0 ; 20 m = n ; 21 for (int i = 2 ; i * i <= n ; i++) { 22 if (m % i == 0) { 23 int y = i ; 24 int k = 0 ; 25 while (y) { 26 k += y % 10 ; 27 y /= 10 ; 28 } 29 while (m % i == 0) { 30 sum2 += k ; 31 m /= i ; 32 } 33 } 34 } 35 if (m == n) 36 continue ; 37 if (m != 1) { 38 int y = m ; 39 int k = 0 ; 40 while (y) { 41 k += y % 10 ; 42 y /= 10 ; 43 } 44 sum2 += k ; 45 } 46 47 if (sum2 == sum) { 48 break ; 49 } 50 } 51 printf ("%d\n" , n ) ; 52 } 53 }
在O(sqrt(N))时间内求得n的所有质因数。
注意1.若跳出循环后n除尽,则cnt 不加1 ; 反之 加一。
2.跳出若为本身,则cnt = 0 ;