分析:一遍遍循环,效率比较低,但可以通过减半和除偶来减少次数,但是依旧不是很理想,数论中有个定论是任意合数都可以由

几个质数乘的,但是目前还没想好怎么运用这个定论,所以将就一下。

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 }