群里最近每天都聊得很嗨,雖然不一定是技術,更多的是生活,還是非常開心。因為工作、程序只是我們生命中的一小部分,人的幸福與否,更多的由人的業余生活和他的精神世界所決定。和一群陌生的人,扯扯淡,毫無壓力的聊聊人生覺得也挺好。
好的,直接奔入主題。情況是這樣的,群里有位同學問了一道算法,求一個整數的最大質因數。然后他給出了代碼(如下所示),但是測試沒有通過。
1 int largest_prime_factor(int n) 2 { 3 while (n >1) 4 { 5 for(int i=2;i<=n;i++) 6 { 7 if(n%i==0) 8 { 9 n = n/i; 10 break; 11 } 12 return n; 13 } 14 } 15 }
第一反應是覺得這個算法肯定是會有些問題的,比如說當n=9時,直接就返回9了。
仔細思考了一下,發現,這真是一個巧妙的解題思路,只不過沒有控制好邊界條件罷了。改正后:
1 int largest_prime_factor(int n){ 2 if (n<1){// 3 return -1; 4 } 5 if (n==1){//判斷邊界條件 6 return 1; 7 } 8 while (n >1){ 9 for(int i=2;i<=n;i++){ 10 if (n==i){//到達n了,就沒有繼續的必要了,已經最大 11 return n; 12 } 13 if(n%i==0){// 14 n = n/i; 15 break; 16 } 17 } 18 } 19 }
自己測試過,沒有問題。
其實,當我第一次看到這道題的時候,我的思路是兩個for循環。但是好像沒有上面的效率高。代碼如下:
bool isZhiSu(int n){//是否是質數,是質數返回true for(int i=2;i<n;i++){ if (n%i==0){ return false; } } return true; } int largest_prime_factor2(int n){ if (n<1){ return -1; } for (int i=n;i>=1;i--){ if (n%i==0&&isZhiSu(i)){//判斷是否能被N整除,並且是質素 return i; } } }
一道質數求解的題目,其實也有很多技巧。哇嘎嘎。。。
版權所有,歡迎轉載,但是轉載請注明出處:瀟一