题目内容:若一个正整数的质因数分解式逐位相加之和等于其本身逐位相加之和,则称这个数为 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 数。
输入格式:
若干个正整数,一行代表一个正整数 N,以输入 0 表示结束
输出格式:
按行输出大于正整数N 的最小 Smith 数
输入样例:
4937774
200
0
输出样例:
4937775
202
代码位置:
package com.niuke.ALG;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class smithNumber {
//大于n的最小smith数
public static int minSmith(int n) {
if(Smith(n)) {
return n;
}else {
return minSmith(++n);
}
}
// 求该数的各项数之和
public static int getSum(int n) {
int sum=0;
while(n!=0) {
sum=n%10+sum;
n=n/10;
}
return sum;
}
// 求该数各个质因数之和
public static int getzhiyinSum(int n) {
int sum1=1;
for(int i=2;i<=n;i++) {
while(n%i==0){
int temp=i;
while(i!=0) {
sum1=i%10+sum1;
i=i/10;
}
i=temp;
n=n/i;
}
}
return sum1;
}
// 判断这个数是不是smith数
public static boolean Smith(int n) {
if(getSum(n)==getzhiyinSum(n)) {
return true;
}
return false;
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
List<Integer>list=new ArrayList<Integer>();
while(n!=0) {
list.add(n);
n=scan.nextInt();
}
for(int str:list) {
System.out.println(minSmith(str));
}
}
}
运行截图位置: