相关知识补充
若一个合数的质因数分解式逐位相加之和等于其本身逐位相加之和,则称这个数为Smith数。
如 :4937775 = 3 × 5 × 5 × 65837,
而 3 + 5 + 5 + 6 + 5 + 8 + 3 + 7 = 42,
并且 4 + 9 + 3 + 7 + 7 + 7 + 5 = 42,
所以说4937775是Smith数。
程序要求
给定一个正整数N,输出大于N的最小Smith数1。
函数设计
1、 int getSum(int num)
//求num的逐位相加之和
2、 int getPrime(int num)
//求num的质因数分解式逐位相加之和
3、 int JudgePrime(int num)
//判断num是否为质数,质数返回1,合数返回0
4、 void main()
完整代码
#include<stdio.h>
#include<math.h>
int getSum(int num)
{
//计算得到正整数的逐位相加之和
int sum = 0;
while(num != 0)
{
sum += num % 10;
num /= 10;
}
return sum;
}
int getPrime(int num)
{
//得到正整数的质因数分解式逐位相加之和
int sum = 0;
while(num > 1)
{
for(int i = 2; i <= num; i++)
{
//从2开始除到本身,用于判断素数
if(num%i==0)
{
//找到素数因子
sum += getSum(i);
break;
}
}
num=num/i; //继续分解除以素数因子得到的商
}
return sum;
}
int JudgePrime(int num)
{
//判断输入的num是不是质数
int i;
int k=(int)sqrt((double)num); //求num的平方根
for(i=2;i<=k;i++)
if(num % i == 0)
break;
if(i > k)
return 1; //判断结果为质数
else
return 0; //判断结果为合数
}
void main()
{
int num;
printf("请输入一个正整数:\n");
scanf("%d",&num);
int temp = num+1;
while((getPrime(temp) != getSum(temp)) || (JudgePrime(temp) == 1))
temp++;
printf("大于%d的最小Smith数是:%d\n",num,temp);
}
运行示例
在本程序默认质数都不是Smith数 ↩︎