1. 程式人生 > >java 藍橋杯 分解質因子

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

方法一:

import java.util.Scanner;  
  
public class Main {  
    public static void main(String[] args)
    {  
         Scanner cn=new Scanner(System.in);
         int q=cn.nextInt();
         int w=cn.nextInt();
         kk(q,w);
    }  
    public static void kk(int q,int w)
    {  	
    	for(int i=q;i<=w;i++)
    	{   		
    		if(i>=2)  //因為1不是素數
    		{
    			int u=i;
        		int p=0;
        		String str=i+"=";
        		int j=2;
    			while(true)
    			{
    				if(u==1)break;  //不斷分解  直到分解完  結束
    				else
    				{
    					if(u%j==0) 
    					{
    						if(p==0){str=str+j;p=1;}  //主要和輸出“*”做區別
    						else str=str+"*"+j;
    						u=u/j;     //不斷整除
    						j=2;       //出現了可以整處的   需要重頭開始   例如8=2*2*2
    					}
    					else j++;    
    				}
    			}
    			System.out.println(str);
    		}
    		
    	}
    }  
}  
說明:可以這樣做的原因是,因為2是素數,所以後面的只要可以被2整處的數都可由2分解,同理3也是,直到最後例如我輸入了13可是2~12沒有沒有一個可以整除所以最後結果就是本身。

方法二:

import java.util.Scanner;  
  
public class Main {  
    
	static int []kk=new int[10001];  //kk[]值為0的就是素數  通過函式篩選
	public static void main(String[] args)
    {  
        ss(); 
		
		Scanner cn=new Scanner(System.in);
         int q=cn.nextInt();
         int w=cn.nextInt();
		 hh(q,w);
    }  
	
	public static void hh(int q,int w)   //求質因子
	{
		for(int i=q;i<=w;i++)
		{
			
			if(i>=2)
			{
				int p=0;
				int u=i;
				String str=u+"=";
				for(int j=1;j<100001&&u!=1;j++)
				{
					if(u%j==0&&kk[j]==0)   //只有為0的才是素數
					{
						if(p==0){str=str+j;p=1;}
						else str=str+"*"+j;
						u/=j;
						j--;
					}
				}
				System.out.println(str);
			}
		}
	}
	
	public static void ss()    //這是先求好有哪些素數的函式
	{
		kk[1]=1;
		for(int i=2;i<=10000;i++)
		{
			if(kk[i]==0)
			{
				for(int j=i*2;j<10001;j+=i)//關鍵是這裡的j=i*2 和 j+=i  舉例:最開始2的kk[2]是0  所以j從4開始只要是2的倍數就改kk[]值為1 表示不是素數
					kk[j]=1;
			}
		}		
	}
    
}  

說明:先找到有哪些素數,然後不斷整出素數