定義
質因數(或質因子)在數論裡是指能整除給定正整數的質數。兩個沒有共同質因子的正整數稱為互質。因為1沒有質因子,1與任何正整數(包括1本身)都是互質。正整數的因數分解可將正整數表示為一連串的質因子相乘,質因子如重複可以指數表示。根據算術基本定理,任何正整數皆有獨一無二的質因子分解式。只有乙個質因子的正整數為質數。
例子 1沒有質因子。
5只有1個質因子,5本身。(5是質數。)
6的質因子是2和3。(6 = 2 × 3)
2、4、8、16等只有1個質因子:2(2是質數,4 = 2,8 = 2,如此類推。)
10有2個質因子:2和5。(10 = 2 × 5)
就是乙個數的約數,並且是質數,比如8=2×2×2,2就是8的質因數。12=2×2×3,2和3就是12的質因數。把乙個式子以12=2×2×3的形式表示,叫做分解質因數。16=2×2×2×2,2就是16的質因數,把乙個合數寫成幾個質數相乘的形式表示,這也是分解質因數。[1]
分解質因數的有兩種表示方法,除了大家最常用知道的「短除分解法」之外,還有一種方法就是「塔形分解法」。
分解質因數對解決一些自然數和乘積的問題有很大的幫助,同時又為求最大公約數和最小公倍數做了重要的鋪墊。
短除法
求乙個數分解質因數,要從最小的質數除起,一直除到結果為質數為止。分解質因數的算式的叫短除法,和除法的性質差不多,還可以用來求多個個數的公因式:
分解質因數**:
將乙個正整數分解質因數。例如:輸入90,列印出90=2*3*3*5。
程式分析:對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完成:
(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。
(2)如果n>=k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新的正整數你n,
重複執行第一步。
(3)如果n不能被k整除,則用k+1作為k的值,重複執行第一步。
01
#include "stdio.h"
02#include "conio.h"
03 main()
04
17else
18break;
19 }
20printf("%d",n);
21 getch();
22 }
另一種形式:
01//返回質因數陣列
02 integer decprime(int n)
10list.add(integer.valueof(i));
11 n = n/i;
12 }
13 }
14list.add(integer.valueof(n));
15return
list.toarray(new integer[list.size()]);
16 }
類似方法:
// 質因數.cpp : 定義控制台應用程式的入口點。
//
#include "stdafx.h"
#include
#include
#include
using
namespace
std;
void analyse(int n)
} cout
// 質因數.cpp : 定義控制台應用程式的入口點。
#include "stdafx.h"
#include
#include
#include
using
namespace
std;
void analyse(int n)
//cout<}
cout
複雜度 如果n<2^10 ,這種情況下試除法通常都是很有效的。但是如果用來分解更大的整數,試除法就變得非常低效甚至不可用了。這種演算法的複雜度是隨著n的增加呈指數級別增長的。
試除法是整數分解演算法中最簡單和最容易理解的演算法。
給定乙個合數n(這裡,n是待分解的整數),試除法看成是用小於等於的每個素數去試除待分解的整數。如果找到乙個數能夠整除除盡,這個數就是待分解整數的因子。
分解質因數演算法
題目 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。分析 從1到n先找出最小的質因數,如果等於本身,那麼說明只有乙個質因數,如果不是,那麼將該質因數列印出來,並將n 該質因數作為新的n值進行運算。設計步驟 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2...
分解質因數演算法
以前寫的,有人問我程式的原理,在這裡解釋下 將n分解質因數 一般方法 i從2開始到sqrt n 的每乙個i由n試除,如果能整除就再判斷i是不是素數,如果是則i是n的乙個質因子,然後n n i 再將i歸位回2 再尋找n的質因子 我的優化 大致思路不變,進行了一些剪枝,首先還是i從2開始到sqrt n ...
分解質因數
質因數概念 每個合數都可以寫成幾個質數相乘的形式,這幾個質數就都叫做這個合數的質因數。如果乙個質數是某個數的因數,那麼就說這個質數是這個數的質因數。而這個因數一定是乙個質數。演算法原理 先根據需要分解的合數生成乙個質數表。然後依次從小到大依次除合數,每次除之後都將儲存步驟。表達不好,還是看 吧 us...