Smith Numbers
时间: 1ms 内存:64M
描述:
Smith Numbers
While skimming his phone directory in 1982, mathematician Albert Wilansky 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 named this type of number after his brother-in-law: the Smith numbers.
As this property is true for every prime number, Wilansky excluded them from the definition. Other Smith numbers include 6,036 and 9,985.Wilansky was not able to find a Smith number which was larger than the telephone number of his brother-in-law. Can you help him out?
输入:
The input consists of several test cases, the number of which you are given in the first line of the input. Each test case consists of one line containing a single positive integer smaller than 109.
输出:
For every input value n, compute the smallest Smith number which is larger than n and print it on a single line. You can assume that such a number exists.
示例输入:
1
4937774
示例输出:
4937775
提示:
参考答案(内存最优[748]):
#include"stdio.h"
#include"string.h"
#include"math.h"
int CalDigitsSum(int num)
{
int sum=0;
while(num)
{
sum+=num%10;
num/=10;
}
return sum;
}
int main()
{
int n,i,j,t,s,x;
int sum,sum2;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d",&n);
for(i=n+1;;i++)
{
x=i;
sum=CalDigitsSum(i);
sum2=0;
for(j=2; j*j<=x; j++)
{
if(x%j==0)
s=CalDigitsSum(j);
while(x%j==0)
{
sum2+=s;
x/=j;
}
}
if(x==i)
continue;
if(x!=1)
sum2+=CalDigitsSum(x);
if(sum==sum2)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}
参考答案(时间最优[32]):
#include <iostream>
#include <set>
#include <cmath>
using namespace std;
int work(int n)
{
int c=0,t;
for(int i=2; i*i<=n; ++i)
{
while(n%i==0)
{
n/=i;
t=i;
while(t)
{
c+=t%10;
t/=10;
}
}
}
if(n>1&&c)
{
while(n)
{
c+=n%10;
n/=10;
}
}
return c;
}
int main()
{
int T;
int n;
cin>>T;
while(T--)
{
cin>>n;
for(int i=n+1;; ++i)
{
int t=i;
int c=0;
while(t)
{
c+=t%10;
t/=10;
}
t=work(i);
if(t==c)
{
cout<<i<<endl;
break;
}
}
}
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。