NOIP2012普及组--质因数分解

 

 

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

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

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 }

 

转载于:https://www.cnblogs.com/charlotteandxing/p/4684689.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值