输出400以内的Smith数
输出400以内的Smith数。Smith数是指满足下列条件的可分解的整数:
其所有数位上的数字和=其全部素数因子的数字总和
例如,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; }}