整数因子分解问题

原题地址:
http://yzfy.org/dis/listpost.php?tid=6&extra=page%3D1&page=1
最原始的办法:
 1#include <iostream>
 2using namespace std;
 3bool 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}

16int 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。
当然,还有更快的。先留楼,改天继续。

posted on 2009-08-11 22:38  youthlion  阅读(6735)  评论(0编辑  收藏  举报

导航