分析:一遍遍循环,效率比较低,但可以通过减半和除偶来减少次数,但是依旧不是很理想,数论中有个定论是任意合数都可以由
几个质数乘的,但是目前还没想好怎么运用这个定论,所以将就一下。
PS:这个数肯定是合数,因为1不是质数,所以不可能是1和本身。
1 #include <stdio.h> 2 int main() 3 { 4 int n,i; 5 int j,x=0; 6 scanf("%d",&n); 7 for(i=(n/2);i>2;i--) //因为质因数肯定少与原数的一半,所以从一半开始 8 { 9 if(n%i==0&&i%2!=0) //排除偶数 10 { 11 for(j=3;j<i;j=j+2) 12 { 13 if(i%j==0) //若有其他因数,则不是质数 14 { 15 x=1; 16 break; 17 } 18 19 } 20 21 if(x==0) 22 break; 23 else 24 x=0; 25 } 26 } 27 printf("%d",i); 28 return 0; 29 }
经高人指点,啊,胜读十年书。
原来这个由两个质因数相乘而得的数只有另两个因数(1和它本身),没有第五个因数,所以可以省掉判断,
从大到小看见了就可以上了,(⊙o⊙)…说错了,是可以输出了。还有最小的那个较大因数肯定大于根号N,
可以i到根号N就好了。以下代码:
1 #include <stdio.h> 2 #include<math.h> 3 int main() 4 { 5 int n,i; 6 int j,x; 7 scanf("%d",&n); 8 for(i=(n/2);i>=sqrt(n);i--) //因为质因数肯定少与原数的一半,所以从一半开始,且不小于根号下n 9 { 10 if(n%i==0) 11 { 12 printf("%d",i); //因为除1和它本身外只有这一对质因数,所以能先整除便是最大的 13 break; 14 15 } 16 17 } 18 return 0; 19 }