问题:
输出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); } } } }