您的位置:首页 > 其它

整数因子分解

2011-11-19 19:42 330 查看
原题地址:
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==0) return false;

8

while(temp>divisor)

9



{

10

if(n%divisor==0) return 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。

当然,还有更快的。先留楼,改天继续。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: