整数因子分解
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。
当然,还有更快的。先留楼,改天继续。
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。
当然,还有更快的。先留楼,改天继续。
相关文章推荐
- 整数因子分解
- sdut-1722整数因子分解问题
- 整数因子分解问题
- 整数因子分解问题
- 数论二1010大整数的质因子分解(此题模板得记)
- 关于整数的质因子分解和筛素数的分析
- 整数的素因子分解
- 整数因子分解问题
- 整数因子分解问题
- 给出一个数字m,求满足m = a^3 + b^3(a,b为正整数)的所有整数对(分解素因子防超时)
- 整数的素因子分解:Pollard rho method
- 整数因子分解的Pollard p-1方法
- 南邮 OJ 1219 整数因子分解问题
- 整数因子分解问题
- 公钥体系基于大整数的素因子难以分解的理论
- 9718 整数因子分解(递归、备忘录法)
- uva 10290 - {Sum+=i++} to Reach N(数论-整数因子分解)
- Pollard_rho算法(大整数的因子分解或判断是否为素数)
- 0048算法笔记——【随机化算法】拉斯维加斯随机化算法求解整数因子分解中的因子分割问题
- 0048算法笔记——【随机化算法】拉斯维加斯随机化算法求解整数因子分解中的因子分割问题