日期:2014-05-20  浏览次数:20961 次

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


------解决方案--------------------
Java code

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