整数因子分解

原题地址:
http://yzfy.org/dis/listpost.php?tid=6&extra=page%3D1&page=1

最原始的办法:

 1 #include  < iostream >
 2 using   namespace  std;
 3 bool  isPrime( int  n)
 4 {
 5    int divisor=3;
 6    int temp=n;
 7    if(n%2==0return false;
 8    while(temp>divisor)
 9    {
10        if(n%divisor==0return false;
11        temp=n/divisor;
12        divisor+=2;
13    }

14    return true;
15}

16 int  main()
17 {
18    int a,cur,i,j;
19    while(scanf("%d",&a)!=EOF)
20    {
21        cur=a;
22        if(cur==0 || cur==1 || isPrime(cur))
23            printf("%d = %d\n",cur,cur);
24        else
25        {
26            printf("%d = ",cur);
27            i=2;
28            while(cur!=1)
29            {
30                j=0;
31                while(cur%i==0)
32                {
33                    cur/=i;
34                    j++;
35                }

36                if(j)
37                {
38                    if(j>1)
39                        printf("%d^%d",i,j);
40                    else
41                        printf("%d",i);
42                    if(cur!=1)
43                    {
44                        printf(" * ");
45                        i++;
46                    }

47                    else
48                        printf("\n");
49                }

50                else
51                {
52                    i++;
53                }

54            }

55        }

56    }

57    return 0;
58}

为了提高速度,看了一段别人的代码:

 1  #include  " stdio.h "
 2  #include  " math.h "
 3  #include  " conio.h "
 4  int  main()
 5  {
 6          unsigned  long  i,j,k,h,m,n;
 7           double  weizhi;
 8           while (scanf( " %ld " , & n) != EOF)
 9          {
10              printf( " %ld = " ,n);
11              h = 1 ;
12              m = n;
13              weizhi = sqrt(n);
14 
15           for (j = 1 ,i = 2 ;i <= weizhi && m != 1 ;j ++ ,i = 2 * j - 1 )
16                  {    
17            
18                       k = 0 ;
19                        while ( ! (m % i))
20                         {
21                                   k ++ ;
22                                   m = m / i;
23                          }
24                        if (k == 1 )
25                          {
26                                     if (h == 1 ){printf( "  %ld " ,i); h ++ ;}
27                                     else  {printf( "  * %ld " ,i); h ++ ;}
28                          }
29                        
30                        if (k > 1 )
31                          {
32                                 if (h == 1 ){printf( "  %ld^%ld " ,i,k); h ++ ;}
33                             else  {printf( "  * %ld^%ld " ,i,k); h ++ ;}
34 
35                          }
36                          
37                  }
38               if (h == 1 ) printf( "  %ld " ,n);
39               else   if (m > 1 )printf( "  * %ld " ,m);
40              printf( " \n " );
41          }
42       return   0 ;
43     
44  }

通过以上代码学习到这样一个事实,若一个整数n有一个大于sqrt(n)的因子,则n的其他因子必然小于sqrt(n),且大于sqrt(n)的因子最多只有一个。(惭愧。。这么明显的问题,没有想到过)。因此,上面的代码在查找数n的因子时,只需循环到sqrt(n)就可以。并且,这个大于sqrt(n)的因子必然是一个质数,或者为1,所以最后再乘一个m。
当然,还有更快的。先留楼,改天继续。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值