分解质因数-Java蓝桥杯

问题描述
  求出区间[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

分析

1、首先筛选出所有的素数,用数组保存到对应位置,不是素数的则保存为0。
2、观察样例输出,发现8 = 2*4=2*2*2,所以可以用一个字符串数组保存之前的分解质因数的式子,suanshi[8] = 2*suanshi[4];

代码

public class Fenjie {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner reader = new Scanner(System.in);
        int a = reader.nextInt();
        int b = reader.nextInt();
        int[] primeArr = new int[b+1]; //保存质数的数组
        Arrays.fill(primeArr, 0);
        isPrime(a,b,primeArr);//如果是质数,则存储相应的质数,否则存储0
        String[] suanshi = new String[b+1];//保存分解的式子
        getSuanshi(suanshi,primeArr,b);//得到质解算式
        for(int i=a;i<=b;i++)
        {
            System.out.println(i+"="+suanshi[i]);
        }

    }
    public static void getSuanshi(String[] suanshi,int[] primeArr,int b)
    {
        for(int i=2;i<=b;i++)
        {       
            if(primeArr[i] != 0)
            {
                suanshi[i] = i+"";
            }else
            {
                for(int j=2;j<=Math.sqrt(b);j++)
                {
                  if(i % j==0) //可以整除
                  {
                      if(primeArr[i/j] !=0) //如果商是素数
                      {
                          suanshi[i] = j+"*"+(i/j);
                      }
                      else//如果商不是素数
                      {
                          suanshi[i] = j+"*"+(suanshi[i/j]);
                      }
                      break;
                  }
                }
            }       
        }
    }
    public static void isPrime(int a,int b,int[] primeArr)
    {
        for(int i=2;i<=b;i++)
        {
            int sign = 1;
            for(int j=2;j<Math.sqrt(b);j++)
            {
                if(i % j ==0 && i!=j)
                {
                    sign = 0;
                    break;
                }
            }
            if(1==sign) //如果是质数则直接保存
            {
                primeArr[i] = i;
            }
        }

    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值