输出400以内的Smith数。Smith数是指满足下列条件的可分解的整数:
           其所有数位上的数字和=其全部素数因子的数字总和
例如,9975是Smith数,9975=3*5*5*7*19,即9975的数字和=因子的数字总和=30

解决方案 »

  1.   


    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;
    }
    }