黑马程序员技术交流社区
标题: Java基础算法题(第四天) [打印本页]
作者: 黄小贝 时间: 2012-10-20 03:16
标题: Java基础算法题(第四天)
饭后一道题,天天好心情~~
题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
表示我擅长把简单的事情复杂化,虽然做出结果了,但是算法实在是太坑爹了,我这里不好意思先贴自己的坑爹算法,目测学妹看到了会鄙视我的。。
先看标准答案~简洁无比~
- package day4;
- import java.util.Scanner;
- public class Test2 {
- public static void main(String[] args) {
- // 解决要分解的数字
- System.out.println("请输入要分解的数字(一定要是整数):");
- Scanner in = new Scanner(System.in);
- int i = in.nextInt();
- // 分解方法
- int k = 2;
- System.out.print(i + "=");
- while (i > k) {
- if (i % k == 0) {
- System.out.print(k + "*");
- i = i / k;
- } else {
- k++;
- }
- }
- System.out.print(i + ";");
- }
- }
复制代码 咳咳,我这里要展示我的坑爹算法了~
看看有没有和我一样这样做的,受上次那道求素数的题的影响,这次我的思路是
(1)算出所有小于 90 的素数
(2)遍历这些素数,然后看看有没有能被90整除的,有的话,把这个整数加入 List
(3)然后用相除的结果递归调用 (1)(2)- package day4;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- /**
- * 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
- *
- * @author yellowbaby
- *
- */
- public class Test {
- private static List<Integer> integers = new ArrayList<Integer>();
- public static void main(String[] args) {
- decompose(90);
-
- System.out.println(integers);
- }
- /**
- * 利用递归分解整数 i
- */
- private static void decompose(int i) {
- List<Integer> primes = getPrime(i);
- for (Iterator<Integer> it = primes.iterator(); it.hasNext();) {
- int current = it.next();
- if (i % current == 0) {
- integers.add(current);
- decompose(i / current);
- break;
- }
- }
- }
- /**
- * 得到小于 i 的所有素数
- */
- private static List<Integer> getPrime(int i) {
- List<Integer> retVal = new ArrayList<Integer>();// 存放所有的素数
- for (int num = 2; num <= i; num++) {
- if (isPrime(num)) {
- retVal.add(num);
- }
- }
- return retVal;
- }
- /**
- *
- * 判断是否是素数,素数的概念:指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数
- */
- private static boolean isPrime(int num) {
- for (int i = 2; i*i < num; i++) {
- if (num % i == 0) {
- return false;
- }
- }
- return true;
- }
- }
复制代码
作者: 给生活加点料 时间: 2012-10-20 07:26
沙发,顶。
作者: 刘伟平 时间: 2012-10-20 08:34
我当时做的时候也是受到前面求素数那道题目的影响,现在看了答案明白了,直接从2一直++去试除即可,如果k不是素数,那么前面的k肯定已经把此时k的质因数除去了,所以i % k == 0的条件就不可能满足,会直接k++。
我的算法里面有求最小素数的方法,有判断是不是素数的方法,确实没想到这些不用判断。{:soso_e134:}- class Test04
- {
- public static void main(String[] args)
- {
- //参数传入要分解质因数的正整数
- resolve(13463634);
- }
- //输出
- public static void resolve(int num)
- {
- //判断是否是正整数
- if (num<0)
- {
- System.out.println("请输入正整数");
- return;
- }
- String result = num+" = ";
- int k = 2;
- while ((k = minRemNum(num)) != num)
- {
- result +=k + "*";
- num = num/k;
- System.out.println(result);
- }
- System.out.println(result+k);
- }
- //获得能整除num的最小素数
- private static int minRemNum(int num)
- {
- for (int r = 2; r<num+1 ; r++ )
- {
- if(isRem(r) && num%r==0)
- return r;
- }
- return 1;
- }
- //判断参数是否是素数
- private static boolean isRem(int r)
- {
- for (int m = 2; m<r ; m++ )
- {
- if (r%m == 0)
- return false;
- }
- return true;
- }
- }
复制代码
作者: 孙卫营 时间: 2012-10-20 08:41
不错 学习了 c#试试
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |