求大于所输入正整数的最小Smith数

求大于所输入正整数的最小Smith数

  • 相关知识补充
  • 程序要求
  • 函数设计
  • 完整代码
    • 运行示例

相关知识补充

若一个合数的质因数分解式逐位相加之和等于其本身逐位相加之和,则称这个数为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

函数设计

1int getSum(int num)
	//求num的逐位相加之和
2int getPrime(int num)
	//求num的质因数分解式逐位相加之和
3int JudgePrime(int num)
	//判断num是否为质数,质数返回1,合数返回0
4void main()

完整代码

#include
#include

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数_第1张图片


  1. 在本程序默认质数都不是Smith数 ↩︎

你可能感兴趣的:(算法设计,Smith数,质数,质因数)