输出400百以内的smith数。smith数是指满足下列条件的可分解的整数:
其所有位数上的数字和等于其全部素数因子的数字之和。
例如,9975是smith数,9975=3*5*5*7*19,即9975的数字和=因子的数字总和=30.
补充说明一下:根据smith数的定义,素数不是smith数。
java代码实现:
public class SmithNum {
/**
* @param args
* 输出400百以下的所有smith数
*/
public static void main(String[] args) {
int[] num1 = new int[20];
for (int i = 1; i < 400; i++) {
if (isPrime(i)) // 素数不是smith数,直接pass掉
continue;
int k = 0;
int sum1 = 0;// 所有的因子的数字总和
int sum2 = 0;// i的数字总和
for (int j = 2; j <= i; ++j) { // 求数i的所有素数,并存进数组num1中
if (i % j == 0) {
if (isPrime(j)) { // 如果为true,就把数存进数组中
int[] tempArr1 = intToNumArray(j);
for (int m = 0; m < tempArr1.length; m++)
num1[k++] = tempArr1[m];
int temp = j * j;
while (i % temp == 0) {
for (int m = 0; m < tempArr1.length; m++)
num1[k++] = tempArr1[m];
temp *= j;
}
}
}
}
for (int p = 0; p < k; p++)
// 求所有因子的数字之和
sum1 += num1[p];
int[] tempArr2 = intToNumArray(i);
for (int p = 0; p < tempArr2.length; p++)
// 求数字本身的数字之和
sum2 += tempArr2[p];
if (sum1 == sum2) {
System.out.print(i+" ");
}
}
}
public static int[] intToNumArray(int n) {
String str = Integer.toString(n); // 将整型数字转换成字符串
int[] nums = new int[str.length()];
for (int i = 0; i < str.length(); i++)
// 将字符串中对应的字符数字输到数组中
nums[i] = Integer.parseInt(String.valueOf(str.charAt(i)));
return nums; // 返回一个整型数组
}
public static boolean isPrime(int n) { // 判断一个整型数是不是素数
if (n == 2)
return true;
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0)
return false;
}
return true;
}
}