输出400以内的Smith数。Smith数是指满足下列条件的可分解的整数:
其所有数位上的数字和=其全部素数因子的数字总和
例如,9975是Smith数,9975=3*5*5*7*19,即9975的数字和=因子的数字总和=30
其所有数位上的数字和=其全部素数因子的数字总和
例如,9975是Smith数,9975=3*5*5*7*19,即9975的数字和=因子的数字总和=30
import java.util.*;public class SmithTest{
public static void main(String[] args) {
List<Integer> smith = new ArrayList<Integer>();
// 打印出1-400的结果
StringBuffer buf;
for (int i = 1; i < 400; i++) {
int[] a = findFactors(i);
int count = count(i);
buf = new StringBuffer();
buf.append("数:").append(i);
buf.append(" 素数因子:").append(toString(a));
buf.append(" 数字和:").append(count);
if (multiply(a) == count) {
buf.append("\t是");
smith.add(i);
} else {
buf.append("\t不是");
}
buf.append("\tsmith数");
System.out.println(buf);
}
System.out.println("符合smith数:" + smith);
} /** 数组to字串 */
public static String toString(int[] a) {
StringBuffer buf = new StringBuffer();
for (int i : a) {
if (buf.length() > 0) {
buf.append(",");
}
buf.append(i);
}
return buf.toString();
} /** 计算所有数位上的数字和 */
public static int count(int i) {
int ret = 0;
while (i != 0) {
ret += i % 10;
i = i / 10;
}
return ret;
} /** 计算数组的乘积 */
public static int multiply(int[] a) {
int ret = 1;
for (int i : a) {
ret *= i;
}
return ret;
} /** 得到一个数的所有素数因子 */
public static int[] findFactors(int number) {
List<Integer> buf = new ArrayList<Integer>();
// 实际上就是求他的质因数
for (int i = 2; i <= Math.sqrt(number); i++) {
// 循环求i是不是它的质因数,直到i不是它的因数为止(i = 4能被整除的不可能出现,因为当i=2时已经被全求出来了) //
// 也就是说number % i==0的情况,只有当i为质数时才有可能出现。
while (true) { // 如果能整除,就求number/i的质因数
if (number % i == 0) {
buf.add(i);
number /= i;
} else {
break;
}
}
}
if (number != 1) {
buf.add(number);
}
int[] ret = new int[buf.size()];
int i = 0;
for (Integer o : buf) {
ret[i++] = o.intValue();
}
return ret;
}
}