现在的位置: 首页 > 综合 > 正文

POJ 1142 暴力!

2017年11月23日 ⁄ 综合 ⁄ 共 2424字 ⁄ 字号 评论关闭
Smith Numbers
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 8209   Accepted: 2867

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

先开始一直在想算法,不过后来看了帖子才知道暴力也可以,而且还很快。。(擦,什么鸟数据。。)

Source Code

Problem: 1142   User: bingshen
Memory: 204K   Time: 32MS
Language: C++   Result: Accepted
  • Source Code

    #include<stdio.h>
    #include<algorithm>
    
    using namespace std;
    
    bool prime(int n)
    {
    	int i;
    	for(i=2;i*i<=n;i++)
    		if(n%i==0)
    			return false;
    	return true;
    }
    
    int getsum(int x)
    {
    	int sum=0;
    	while(x)
    	{
    		sum=sum+x%10;
    		x=x/10;
    	}
    	return sum;
    }
    
    bool judge(int x)
    {
    	int sum1,sum2=0,i,num=0;
    	int p[10000];
    	sum1=getsum(x);
    	for(i=2;i*i<=x;i++)
    	{
    		if(x%i==0)
    		{
    			p[num++]=i;
    	//		printf("%d/n",i);
    			x=x/i;
    			while(x%i==0)
    			{
    	//			printf("%d/n",i);
    				p[num++]=i;
    				x=x/i;
    			}
    		}
    		if(x==1)
    			break;
    	}
    	if(x>1)
    	{
    		p[num++]=x;
    //		printf("%d/n",x);
    	}
    	for(i=0;i<num;i++)
    	{
    		sum2=sum2+getsum(p[i]);
    //		printf("%d ",p[i]);
    	}
    //	printf("/n");
    	if(sum1==sum2)
    		return true;
    	else
    		return false;
    }
    
    int main()
    {
    	int n,i;
    	while(scanf("%d",&n)!=EOF)
    	{
    		if(n==0)
    			break;
    		for(i=n+1;;i++)
    		{
    			if(prime(i))
    				continue;
    			if(judge(i))
    			{
    				printf("%d/n",i);
    				break;
    			}
    		}
    	}
    	return 0;
    }
    

抱歉!评论已关闭.