基础训练4-质因数分解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a549654065/article/details/79313943

问题描述

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

输入格式

  输入两个整数ab

输出格式

  每行输出一个数的分解,形如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自然数中,除了1和此整数自身外,没法被其他自然数整除的数

 

求素数常用算法:


解法一:

在数据规模规定的范围,先计算出有多少质数,比如在2-10000的这些整数中,我们通过计算知道有 1229个素数。于是我们先创建一个数组来存放这些素数,也就是质数表。这个存放质数的数组从小到大排列,因此,分解质因数,利用模运算,由数组从小到大分解质因数。

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		sc.close();
		
		int[] primeArr = new int[1230];
		int k = 0;
		for (int i = 2, j = 0; i < 10000; i++){
			if (isPrime(i))
				primeArr[j++] = i;
		}
		for (int i = a; i <= b; i++){
			k = i;
			if (isPrime(i))
				System.out.println(i + "=" + i);
			else{
				StringBuffer str = new StringBuffer();
				str.append(i + "=");
				for (int j = 0; j < 1229; j++){
					if (k % primeArr[j] == 0){
						if (k == i)
							str.append(primeArr[j]);
						else
							str.append("*" + primeArr[j]);
						k /= primeArr[j--];
					}
					if (k == 0)break;
				}
				System.out.println(str);
				//str.delete(0, str.length());
			}
		}
	}
	
	
	public static boolean isPrime(int num){
		double tmp = Math.sqrt(num);
		for (int i = 2; i <= tmp; i++){
			if (num % i == 0)
				return false;
		}
		return true;
	}
}

解法二:

在分解某个整数的因数时,判断该因素是否是质因数,如果是,则符合题意。

#include<iostream>  
#include<math.h>  
using namespace std;  
int isprime(int n)  
{  
    for(int i=2;i<=sqrt(n);i++)  
    {  
        if(n%i==0)  
            return 0;  
    }  
    return 1;  
}  
void prime_num(int n )  
{  
    int i,j=0,m=n;  
    cout<<n<<"=";  
    for(i=2;i<=n;i++)  
    {  
        if(n%i==0 && isprime(i))//判断i是n的质因数   
        {  
            while(m%i==0)  
            {  
                if(m/i!=1)  
                    cout<<i<<"*";  
                else  
                    cout<<i<<endl;  
                m=m/i;  
            }  
        }     
    }  
}   
int main()  
{  
    int a,b;  
    cin>>a>>b;  
    for(int k=a;k<=b;k++)  
    {  
        prime_num(k);  
    }  
    return 0;  
}  


猜你喜欢

转载自blog.csdn.net/a549654065/article/details/79313943