分解质因数的误区

简介: 快速学习分解质因数的误区

分解质因数的误区

误区

我原来的想法是找到除数范围内的所有质因数,建立了一个素数筛,然后逐个便利判断是是除数的引述,很是麻烦,而且时间复杂度高,大致为O(n)级别代码如下:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
public class 分解质因数 {
  static Set<Integer> set=new HashSet<Integer>();
  static List<Integer> list=new ArrayList<Integer>();
  public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    shai(n);//素数筛
    int temp=n;
    while(temp!=1) {
      for (int k : set) {
        if(temp%k==0) {
          temp/=k;
          list.add(k);
          break;
        }
      }
    }
    System.out.print(n+"=");
    for (int i = 0; i < list.size()-1; i++) {
      System.out.print(list.get(i)+"*");
    }
    System.out.println(list.get(list.size()-1));
  }
  private static void shai(int n) {
    boolean a[]=new boolean [n+1];
    for (int i = 2; i < a.length; i++) {
      if(!a[i]) {
        for (int j = 2*i; j < a.length; j+=i) {
          a[j]=true;
        }
      }
    }
    for (int i = 2; i < a.length; i++) {
      if(!a[i]) {
        set.add(i);//筛,储存在map中
      }
    }
  }
}

正解

但是这种打表的时间复杂度太高了,可从从2开始便利,如果有能除以2,就继续出2,直到把2除尽了,然后后面4,6,8就不能作为因数了。3,5,7同理,代码如下:

import java.util.Scanner;
/*
 * 此题我做的时候出现了一个误区,就是认为需要找出这个数字之内的所有质因数
 * 就是说需要判断除数是不是都是质因数,但是完全不需要如此
 * 因为如果2都除尽了,就不再有4,6,8。3同理。。。。
 * 
 * */
public class 分解质因数2 {
  public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    int temp=n;
    System.out.print(n+"=");
    for (int i = 2; i <=n; i++) {
      if(temp%i==0) {
        System.out.print(i);
        temp/=i;
        if(temp==1) break;//当,所有质因数找到之后,结束循环
        i--;//保持因数不变,继续除干净
        System.out.print("*");
      }
    }
  }
}
相关文章
|
4月前
|
C语言
浙大版《C语言程序设计(第3版)》题目集 练习8-2 计算两数的和与差 (10分)
浙大版《C语言程序设计(第3版)》题目集 练习8-2 计算两数的和与差 (10分)
|
4月前
|
机器学习/深度学习 算法 测试技术
青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”(二)
这篇内容是关于解题策略的,主要介绍了在面对应用题时可以采用的“三板斧”方法:举例、模拟和找规律。通过一个走楼梯的例子详细解释了这三个步骤如何运用。首先,举例将抽象问题具体化,比如走5级台阶有几种方式。其次,通过模拟不同情况,例如思考走每一步的可能,发现递归或循环的模式。最后,通过找规律归纳出一般性的解决方案,这里发现走台阶问题与斐波那契数列相关。文章还提到了一个拓展案例——矩形覆盖问题,同样可以用类似的方法分析。总的来说,文章强调了解题过程中理解和转化问题的重要性,以及通过训练提升这方面能力。
37 0
|
4月前
|
C语言
青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”(一)
这篇内容介绍了C语言学习中的经典例题——斐波那契数列,强调了解题思路的重要性。斐波那契数列是一个数列,其中每个数是前两个数的和。文章指出,很多类似题目,如“青蛙跳台阶”,实质上都在考察斐波那契数列的实现。文中提供了斐波那契数列的定义、代码实现和递归与非递归的思路,并鼓励读者从问题中分析出解题模型,而非直接套用已知方法。此外,还提及了一道相关题目“矩形覆盖问题”,以供进一步练习。
34 0
宝藏例题(欧几里得算法+素数的三种境界………)
宝藏例题(欧几里得算法+素数的三种境界………)
宝藏例题(欧几里得算法+素数的三种境界………)
|
4月前
|
算法 C++
试除法求约数:深入分析与实践
试除法求约数:深入分析与实践
43 3
|
4月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 回文数(不要小看回文数)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 回文数(不要小看回文数)
24 0
|
4月前
|
算法
第十四届蓝桥杯集训——for——判断质数/素数
第十四届蓝桥杯集训——for——判断质数/素数
49 0
|
4月前
|
机器学习/深度学习
蓝桥杯-2/14天-完全平方数【另类思路】
蓝桥杯-2/14天-完全平方数【另类思路】
|
机器学习/深度学习 算法 索引
算法步步为营(1)-两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。可以按任意顺序返回答案。
78 0