A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄小贝 高级黑马   /  2012-10-20 03:16  /  2082 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

饭后一道题,天天好心情~~

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

表示我擅长把简单的事情复杂化,虽然做出结果了,但是算法实在是太坑爹了,我这里不好意思先贴自己的坑爹算法,目测学妹看到了会鄙视我的。。

先看标准答案~简洁无比~

  1. package day4;

  2. import java.util.Scanner;

  3. public class Test2 {

  4.         public static void main(String[] args) {
  5.                 // 解决要分解的数字
  6.                 System.out.println("请输入要分解的数字(一定要是整数):");
  7.                 Scanner in = new Scanner(System.in);
  8.                 int i = in.nextInt();

  9.                 // 分解方法
  10.                 int k = 2;
  11.                 System.out.print(i + "=");
  12.                 while (i > k) {
  13.                         if (i % k == 0) {
  14.                                 System.out.print(k + "*");
  15.                                 i = i / k;
  16.                         } else {
  17.                                 k++;
  18.                         }
  19.                 }
  20.                 System.out.print(i + ";");
  21.         }
  22. }
复制代码
咳咳,我这里要展示我的坑爹算法了~

看看有没有和我一样这样做的,受上次那道求素数的题的影响,这次我的思路是

(1)算出所有小于 90 的素数
(2)遍历这些素数,然后看看有没有能被90整除的,有的话,把这个整数加入 List
(3)然后用相除的结果递归调用 (1)(2)
  1. package day4;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;

  5. /**
  6. * 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
  7. *
  8. * @author yellowbaby
  9. *
  10. */
  11. public class Test {

  12.         private static List<Integer> integers = new ArrayList<Integer>();

  13.         public static void main(String[] args) {

  14.                 decompose(90);
  15.                
  16.                 System.out.println(integers);

  17.         }

  18.         /**
  19.          * 利用递归分解整数 i
  20.          */
  21.         private static void decompose(int i) {

  22.                 List<Integer> primes = getPrime(i);

  23.                 for (Iterator<Integer> it = primes.iterator(); it.hasNext();) {
  24.                         int current = it.next();
  25.                         if (i % current == 0) {
  26.                                 integers.add(current);
  27.                                 decompose(i / current);
  28.                                 break;
  29.                         }
  30.                 }
  31.         }

  32.         /**
  33.          * 得到小于 i 的所有素数
  34.          */
  35.         private static List<Integer> getPrime(int i) {

  36.                 List<Integer> retVal = new ArrayList<Integer>();// 存放所有的素数

  37.                 for (int num = 2; num <= i; num++) {
  38.                         if (isPrime(num)) {
  39.                                 retVal.add(num);
  40.                         }
  41.                 }
  42.                 return retVal;
  43.         }

  44.         /**
  45.          *
  46.          * 判断是否是素数,素数的概念:指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数
  47.          */
  48.         private static boolean isPrime(int num) {
  49.                 for (int i = 2; i*i < num; i++) {
  50.                         if (num % i == 0) {
  51.                                 return false;
  52.                         }
  53.                 }
  54.                 return true;
  55.         }

  56. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

3 个回复

倒序浏览
沙发,顶。
回复 使用道具 举报
我当时做的时候也是受到前面求素数那道题目的影响,现在看了答案明白了,直接从2一直++去试除即可,如果k不是素数,那么前面的k肯定已经把此时k的质因数除去了,所以i % k == 0的条件就不可能满足,会直接k++。
我的算法里面有求最小素数的方法,有判断是不是素数的方法,确实没想到这些不用判断。{:soso_e134:}
  1. class  Test04
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 //参数传入要分解质因数的正整数
  6.                 resolve(13463634);
  7.         }

  8.         //输出
  9.         public static void resolve(int num)
  10.         {
  11.                 //判断是否是正整数
  12.                 if (num<0)
  13.                 {
  14.                         System.out.println("请输入正整数");
  15.                         return;
  16.                 }
  17.                 String result = num+" = ";
  18.                 int k = 2;
  19.                 while ((k = minRemNum(num)) != num)
  20.                 {
  21.                         result +=k + "*";
  22.                         num = num/k;
  23.                         System.out.println(result);
  24.                 }
  25.                 System.out.println(result+k);
  26.         }

  27.         //获得能整除num的最小素数
  28.         private static int minRemNum(int num)
  29.         {
  30.                 for (int r = 2; r<num+1 ; r++ )
  31.                 {
  32.                         if(isRem(r) && num%r==0)
  33.                                 return r;
  34.                 }
  35.                 return 1;
  36.         }

  37.         //判断参数是否是素数
  38.         private static boolean isRem(int r)
  39.         {
  40.                 for (int m = 2; m<r ; m++ )
  41.                 {
  42.                         if (r%m == 0)
  43.                                 return false;
  44.                 }
  45.                 return true;
  46.         }
  47. }
复制代码
回复 使用道具 举报
不错 学习了 c#试试
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马