蓝桥杯 分解质因数 Java解法(递归、非递归)

来源:互联网 发布:淘宝运动鞋正品店 编辑:程序博客网 时间:2024/06/05 18:46

问题描述
  求出区间[a,b]中所有整数的质因数分解。

输入格式
  输入两个整数a,b。
输出格式
  每行输出一个数的分解,形如k=a1*a2*a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)

样例输入
3 10
样例输出
3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5

提示
  先筛出所有素数,然后再分解。
数据规模和约定
  2<=a<=b<=10000

根据以往的经验,一般循环的问题,都可以转换为递归的问题,而形成递归的思路也是起源于循环,而想使用递归代替循环,是为了简化美化代

下面提供非递归、递归的两种Java解法
(1)非递归
①为了助于理解,先提供一个有点小瑕疵的代码,即格式上未解决=*

import java.util.Scanner;public class Main {       public static void main(String[] args) {              Scanner in = new Scanner(System.in);              int begin = in.nextInt();              int end = in.nextInt();              for (int k = begin; k <= end; k++) {                     System.out.println(fun(k));              }       }       public static String fun(int n) {              String s = "" + n + "=";              for (int i = 2; i < n; i++) {// 每次对会把最小因数查出来                     if (n % i == 0) { //把符合要求的加近字符串,还要注意格式                           s += "*";                           s += i;                           n /= i;                           i = 1; // 重新循环从小到大查因数,切不能令i=2,因为循环结束了会i++                     }              }              // 注意别忘了加上最后一个质因数              return s + "*" + n;       }}

console 输出

这里写图片描述

②下面解决这个问题,即使用 flag 标记来区分=号后面是否已经有数字了,
有则在新加质因数时,先加*再加数字
没有则在新加质因数时,直接加数字

import java.util.Scanner;public class Main {       public static void main(String[] args) {              Scanner in = new Scanner(System.in);              int begin = in.nextInt();              int end = in.nextInt();              for (int k = begin; k <= end; k++) {                     System.out.println(fun(k));              }       }       public static String fun(int n) {              boolean flag = false; //因=号后面先加数字再加*的,这里作下区分              String s = "" + n + "=";              for (int i = 2; i < n; i++) {//每次对会把最小因数查出来                     if (n % i == 0) {  //把符合要求的加近字符串,还要注意格式                           if (flag == false) {                                  s += i;                                  flag = true;                           } else {                                  s += "*";                                  s += i;                           }                           n = n / i;                           i = 1; //重新循环从小到大查因数,切不能令i=2,因为循环结束了会i++                     }              }              //注意别忘了加上最后一个质因数              if (flag == false) {                     return s + n;              }              return s + "*" + n;       }}

这里写图片描述

(2)下面附上的递归解法

import java.util.Scanner;public class Main {    public static void main(String[] args) {        Scanner reader = new Scanner(System.in);        int start=reader.nextInt();        int end=reader.nextInt();              for(int i=start;i<=end;i++){            System.out.println(i+"="+fun(i).substring(1));        }    }    static String fun(int n){        String str="";        for(int i=2;i<n;i++){            if(n%i==0){                            return "*"+str+i+fun(n/i);            }        }          return "*"+n;    }}
原创粉丝点击