试题 基础练习 分解质因数

资源限制

时间限制:1.0s 内存限制:512.0MB


问题描述

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


输入格式

输入两个整数a,b。
  


输出格式

每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
  


样例输入

3 10


样例输出

3=3
4=22
5=5
6=2
3
7=7
8=222
9=33
10=2
5


提示

先筛出所有素数,然后再分解。
  


数据规模和约定

2<=a<=b<=10000

在写这个题的时候,我创建素数表的空间写了10000,然后一直报超时的错误,我还以为是我的代码写的太复杂了,然后我就一直在改,耗费了很多时间,所以以后类似的题目尽量将数组的存放空间设置大一点

代码示例如下:

import java.util.Scanner;

public class 分解质因数 {
    //存放素数的数组
    static int[] ans=new int[100000];
    //判断是否为素数
    public static boolean isPrime(int n){
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if(n%i==0){
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt();
        int b=sc.nextInt();
        //创建素数表
        int z=0;
        for (int i = 2; i < ans.length; i++) {
            if(isPrime(i)){
                ans[z]=i;
                z++;
            }
        }
        for (int i = a; i <= b; i++) {
            System.out.printf("%d=",i);
            //如果有1则直接输出
            if(i==1){
                System.out.printf("%d=%d",1,1);
            }else {
            	//将i的值赋给j,以更好地求i的质因数,k表示遍历ans
                int j=i,k=0;
                //i的质因数肯定是要小于i的
                while (ans[k] <= i) {
                	//j已经是素数
                    if(j==ans[k]){
                        System.out.printf("%d",ans[k]);
                        break;
                    }
                    //j不是素数
                    else {
                        //如果ans[k]是i的质因数
                        if(j%ans[k]==0){
                            System.out.printf("%d*",ans[k]);
                            j/=ans[k];
                        }else {
                            k++;
                        }
                    }
                }
            }
            System.out.println();
        }
    }
}

若有更好的想法欢迎与我交流呀

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lilianac

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值