群里最近每天都聊得很嗨,虽然不一定是技术,更多的是生活,还是非常开心。因为工作、程序只是我们生命中的一小部分,人的幸福与否,更多的由人的业余生活和他的精神世界所决定。和一群陌生的人,扯扯淡,毫无压力的聊聊人生觉得也挺好。
好的,直接奔入主题。情况是这样的,群里有位同学问了一道算法,求一个整数的最大质因数。然后他给出了代码(如下所示),但是测试没有通过。
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; } } }
一道质数求解的题目,其实也有很多技巧。哇嘎嘎。。。
版权所有,欢迎转载,但是转载请注明出处:潇一