当前位置: 代码迷 >> J2SE >> 输出400之内的Smith数
  详细解决方案

输出400之内的Smith数

热度:64   发布时间:2016-04-24 12:18:20.0
输出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;    }}
  相关解决方案