问题:
输出400以内的Smith数。Smith数是指满足下列条件的可分解的整数:
其所有数位上的数字和=其全部素数因子的数字总和
例如,9975是Smith数,9975=3*5*5*7*19,即9975的数字和=因子的数字总和=30
注意相加都是数位相加,而且是要可以分解的数,意思是质数就不能了。
Java实现:
import java.util.*;
class Smith {
static int[] a = new int[500];
public static void div_factors(int n) {
int i = 2;
int j = 0;
Arrays.fill(a,0);
while(i<=n){
if (n % i == 0) {
a[j] = i;
j++;
n /= i;
i = 2;
}
else
i++;
}
}
public static int num_add(int n) {
int ans = 0;
do{
int tmp = n % 10;
ans += tmp;
n /= 10;
}while(n>0);
return ans;
}
public static boolean isPrime(int n){
int i;
for( i = 2; i <= Math.sqrt(n); i++){
if(n % i == 0)
break;
}
if(i == (int)(Math.sqrt(n)+1))
return false;
else
return true;
}
public static void main(String[] args) {
for(int pos = 2; pos <= 400; pos++) {
int sum = 0;
div_factors(pos);
int q = 0;
while(true){
if(a[q]!=0&&a[q]<10){
sum += a[q];
q++;
}
else if(a[q]>10){
do{
int tmp = a[q]%10;
sum += tmp;
a[q] /= 10;
}while(a[q]>0);
q++;
}
if(a[q] == 0)
break;
}
if(num_add(pos)==sum){
if(isPrime(pos))
System.out.println(pos);
}
}
}
}