任意乙個大於1的正整數都能表示成若干個質數的乘積,且表示的方法是唯一的。換句話說,乙個數能被唯一地分解成質因數的乘積。因此這個定理又叫做唯一分解定理。
c++#include
#include
#include
using namespace std;
int main()
;int num[32] = ;
int local = 0;
unsigned short try_num = 2;
while (try_num*try_num <= n)//若n小於4,則用此**時,需要特判
if (flag)
try_num++;
}int k = 0;
while (prime[k])
else
k++;
}if (n != 1)
cout <
system("pause");
return 0;
} pscal
var prime,num:array[0..32]of longint;
n,try_num,local,flag:longint;
procedure init;
begin
readln(n);
fillchar(prime,sizeof(prime),0);
fillchar(num,sizeof(num),0);
local:=0;try_num:=2;flag:=0;
end;
procedure main;
var k:longint;
begin
while try_num*try_num<=n do
begin
while n mod try_num=0 do
begin
prime[local]:=try_num;
inc(num[local]);
n:=n div try_num;
flag:=1;
end;
if flag=1 then
begin
inc(local);
flag:=0;
end;
inc(try_num);
end;
k:=0;
while prime[k]<>0 do
begin
if prime[k+1]<>0 then
begin
if num[k]>1 then
write(prime[k],'^',num[k],'*')
else write(prime[k],'*');
endelse
begin
if num[k]>1 then
write(prime[k],'^',num[k])
else write(prime[k]);
end;
inc(k);
end;
if n<>1 then
writeln('*',n);
end;
begin
assign(input,'1.in');reset(input);
assign(output,'1.out');rewrite(output);
init;
main;
close(input);close(output);
end.
歡迎提出 更快的解決方案
下面的是
**matrix 67的部落格:
現在的問題是,為什麼質因數分解的方法是唯一的。這個結論是如此的顯然和易於接受,以致於有人會脫口而出:這當然是唯一的,不斷使用越來越大的質數去試除,最後得到的肯定是唯一的質因數分解。不可否認,這個演算法本身是沒有任何問題的。根據合數的定義,試除與分解是一定能不斷進行下去的,除非被除數本身變成了乙個質數,而此時也標誌著演算法的結束。問題的關鍵就在於,這並不能說明原數能唯一地表示成質數的乘積:換一種試除的順序會不會得出不同的分解方法?萬一還有什麼別的牛b**也能用來分解質因數,而且結果與上面得到的完全不一樣咋辦?上面給出的演算法只能說明我們能找出至少一種分解質因數的方法,用這種方法得到的結果是唯一的,但到底還有沒有其它偏方秘籍能匯出另外的分解方法來,我們就不得而知了。為了真正地證明,分解質因數的方法是唯一的,我們將再次用到反證法。假設存在某些數,它們有至少兩種分解方法。那麼根據上文提到的「非空正整數集裡存在最小的元素」,一定有乙個最小的數m,它能用至少兩種方法表示成質數的乘積:
m = p1 * p2 * ... * pr = q1 * q2 * ... * qs
下面我們將看到,這種假設會推出乙個多麼荒謬的結果來。不妨設p1 <= p2 <= ... <= pr, q1 <= q2 <= ... <= qs。顯然,p1是不等於q1的,不然兩邊同時約掉它,我們就得到乙個更小的有兩種分解方法的數。不妨設p1 < q1,那麼我們用p1替換掉等式最右邊中的q1,得到乙個比m更小的數t = p1 * q2 * q3 * ... * qs。令m' = m - t,我們得到m'的兩種表達:
m' = (p1 * p2 * ... * pr) - (p1 * q2 * ... * qs) = p1 * (p2 * .. * pr - q2 * ... * qs) …… (1)
m' = (q1 * q2 * ... * qs) - (p1 * q2 * ... * qs) = (q1 - p1) * q2 * ... * qs ……………… (2)
由於t比m小,因此m'是正整數。從(1)式中我們立即看到,p1是m'的乙個質因子。注意到m'比m小,因此它的質因數分解方式應該是唯一的,可知p1也應該出現在表示式(2)中。既然p1比所有的q都要小,因此它不可能恰好是(2)式中的某個q,於是只可能被包含在因子(q1-p1)裡。但這就意味著,(q1-p1)/p1除得盡,也就是說q1/p1-1是乙個整數,這樣q1/p1也必須得是整數。我們立即看出,p1必須也是q1的乙個因子,這與q1是質數矛盾了。這說明,我們最初的假設是錯誤的。
唯一分解定理的乙個重要的推論是,如果質數p是ab的因子,那麼p或者是a的因子,或者是b的因子。我們剛才在證明過程中也不自覺地用到了這個推論。證明方法很簡單,假如a和b裡面都不含p,把a和b各自分解開來再乘到一起,我們就得到了數ab的乙個沒有因子p的分解方式;而按照前面提到的試除法,ab是可以表示成p與另一些質數的乘積的,這違背了唯一分解定理。連續多次使用該推論,我們可以很快將推論推廣到多個數的情形。
事實上,假設這個推論成立,我們也能很快反過來推出唯一分解定理:寫出n的兩種質因數分解,在前一種分解中任取乙個因子,它必然會在後一種分解方法中出現;把它們約掉之後結論繼續適用,不斷進行該操作直到最終兩邊都只餘下乙個1。這一系列操作說明了,兩種分解方法實際上是相同的。我們看到,唯一分解定理和它的推論實際上是等價的。如果我們能夠繞過唯一分解定理,用另一種方法證出這個推論,我們也就相當於找到了唯一分解定理的另乙個證明。而事實上,運用擴充套件的輾轉相除演算法,我們可以飛快地完成推論的證明。我們將說明,如果質數p能整除ab,但不整除a,那它一定是b的約數。
質數p不能整除a,告訴我們a和p互質,於是存在整數k和l使得ka + lp = 1。等式兩邊同時乘以b,我們有kab + lpb = b。而ab能被p整除,也即存在整數r使得ab=pr。那麼,kpr + lpb = p(kr + lb) = b,我們立即看出p是b的乙個約數。
唯一分解定理
唯一分解定律 又稱為正整數的唯一分解定理,即 每個大於1的自然數均可寫為質數的積,而且這些素因子按大小排列之後,寫法僅有一種方式。當題目有大數相除,求餘數時,精度要求高時.就要運用唯一分解定律 以下唯一分解定律證明 為了真正地證明,分解質因數的方法是唯一的,我們將再次用到反證法。假設存在某些數,它們...
唯一分解定理
problem description 假設x是乙個正整數,它的值不超過65535 即1 x 65535 請編寫乙個程式,將x分解為若干個素數的乘積。input 輸入的第一行含乙個正整數k 1 k 10 表示測試例的個數,後面緊接著k行,每行對應乙個測試例,包含乙個正整數x。output 每個測試例...
唯一分解定理
唯一分解定理 任何乙個大於1的自然數n,如果n不是質數,那麼n可以分解成有限個素數的乘積 例 n p1 a1 p2 a2 p3 a3 其中p1在做 uva10375 時學到了這個演算法,雖然自己理解的還不透徹,先把自己的看法寫下來,日後再完善 要用唯一分解定理第一步當然是素數打表了 之前素數打表一直...