由於數學太差了,來搞搞pe,先從水題做起。
題意:13195的質數因子有5,7,13和29.
600851475143的最大質數因子是多少?
這裡可以肯定的是:1.數字很大,絕對不能暴力。2.如果這是一到oj題,那麼我們的目的就是盡量縮小這個數,減少計算量。
我們都知道,任何乙個合數都是可以由他的所有質因素相乘得到的,比如15=3*3*3*3*3,12=2*2*3,60=2*2*3*5.(這些數都是我隨便想的),好的,我們先看乙個比較小的數60,現在我們要找它的最大質因子,我們可以從最小的奇數開始列舉(當然要先列舉2這個特殊的質數,除此之外的偶數可能是質數嗎?),如果可以整除說明這個奇數是其因子之一,然後判斷這個奇數如果是質數,那麼它就是其中乙個質因子。然後原數就可以除這個因子了,為了排除已經找到的因子,我們一直將它除這個數,直到不能整除,60/=2得30,30/=2得15,到此結束此因子,我們就找到了2這個質因子;同理,到3的時候15/=3得5,找到了3這個質因子;5/5=1,可以結束,5就是我們要找的最大質因子啦。如果是多測試的話一直頻繁判斷素數是不是有點不爽?所以我們可以打個素數表- -。還有乙個優化就是這個素數不會超過sqrt(n),可以減少迴圈次數,至於證明自己搜吧。
下面給出算尤拉計畫的**:
1 #include23#define pause system("pause");45
using
namespace
std;
67 typedef long
long
ll;8 typedef unsigned long
long
ull;910
const
int maxn = 100000000;11
int prime[maxn],cnt_prime=0;12
bool
isprime[maxn];
1314 inline void show(int *ary,int
n)15
1920
void getprime(int
max)
2133}34
}3536 cnt_prime=0;37
for(int i=2;i<=max;i++)
3843}44
}4546int
findit(ull num)
4757
else
58 lastf = 1;59
60 f=3;61
for(int i = 2; num > 1 && f < m; i++)
6272}73
74if(num==1)75
return
lastf;
76else
77return
num;78}
7980
intmain()
81
執行結果:
6857
0.001000 sec
尤拉計畫3 找出乙個合數的最大質數因子
題目 13195 的質數因子有 5,7,13 和 29。600851475143 的最大質數因子是多少?分析 剛開始寫的時候,很麻煩,首先寫了乙個prime函式,然後又在主函式裡寫了乙個迴圈來更新max 迴圈i從2到n,找出n的每乙個質因數 這樣一來,對於這道題,即便是long long型別有可能輸...
關於尤拉公式證明的乙個延拓
現在,我們通過幾種不同的方法來闡述下尤拉公式的證明思想,即證明,e i 1 0.首先指數函式是定義在實數域上的,現在要延拓到複數域上,首先要定義e i,e ix是什麼,嚴格地說,這是一種定義,而且,這個定義是合理的.e ix cosx isinx,e是自然對數的底,i是虛數單位,他將三角函式的定義域...
Python找出乙個數的最大質因素
舉例 首先我們來看個例子 13195的質因數為 5,7,13,29,其中29就是最大的質因數,現在讓我們來計算600851475143的最大質因素。from math import sqrt 質數判斷 def isprime n for i in range 2,int sqrt n 1 if n ...