藍橋杯練習系統 基礎練習(vip試題):BASIC-16 分解質因數

題目信息

問題描述

 求出區間[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的整數中除了能被1和本身整除外,還能被其他數(0除外)整除的數。與之相對的是質數,而1既不屬於質數也不屬於合數。最小的合數是4。
 這裏就不得不提到一個關於分解質因數的定理:唯一分解定理:又稱爲正整數的唯一分解定理,即:每個大於1的自然數均可寫爲質數的積,而且這些素因子按大小排列之後,寫法僅有一種方式。比如12和18,12的因數有:1、2、3、4、6、12,可以分解成好幾種數的乘積:1*12,3*4,2*6,2*2*3。18的因數有:1、2、3、6、9、18,同樣也可以寫成好幾種數的乘積,但是這些種類中都有比較特別的一組:分別是:12 = 2*2*3,18 = 2*3*3,12與18都可以分成幾種形式不同的乘積,但分成質因數連乘積就只有以上一種,而且不能再分解了。你會發現這一組全部都是他們的質因數組成的乘積,由於是質因數當然就不可以再進行分解。通常我們分解質因數的方法有以下幾種:

  • 短除法:

 從最小的質數除起,一直除到結果爲質數爲止。

  • 相乘法

 寫成幾個質數相乘的形式(這些不重複的質數即爲質因數),實際運算時可採用逐步分解的方式。如:36=2*2*3*3 運算時可逐步分解爲36=4*9=2*2*3*3或3*12=3*2*2*3

解題思路

 通過上面的解釋,相信我們已經對分解質因數有了一個比較全面的瞭解。但是我們具體怎樣實現呢?由於短除法在代碼中比較容易實現,所以我們使用短除法進行質因數分解。我們將每一個數從2開始除,因爲2是最小的質數。對n進行分解質因數,應先找到一個最小的質數j,然後按下述步驟完成:
(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,打印出即可。
(2)如果n>j,但n能被j整除,則應打印出j的值,並用n除以j的商,作爲新的正整數n,重複執行第一步。
(3)如果n不能被j整除,則用j+1作爲j的值,重複執行第一步。
該方法又叫做:Pollard Rho快速因數分解,是由John M. Pollard於1975年提出的,該算法時間複雜度爲O(n^(1/4))。
比如360的分解過程爲:
360分解質因數過程

解題代碼

#include<iostream>
using namespace std;

int main(){
	int a,b;
	cin>>a>>b;
	for(int i=a;i<=b;i++){
		int n = i; 
		cout<<n<<"=";
		for(int j=2;j*j <= n;j++){
			while(n%j == 0){
				n = n/j;
				cout<<j;
				if(n!=1)  cout<<"*";
			}
		}
		if(n!=1)  cout<<n;
		cout<<endl;
	}
	
	return 0;

}

 以上就是對於本題的解題思路了。如果你覺得我的文章對你有用請點個贊支持一下吧,喜歡我寫的文章那麼請點個關注再走喲。如果此文章有錯誤或者有不同的見解歡迎評論或者私信。
上號!
我是ACfun:一個成長中的程序猿,感謝大家的支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章