应用试除法对正整数n进行分解
算法设计:
令m=n,从2到根号n进行一一枚举,如果当前数能够整除m,那么当前数就是n的素因子。并用整数m将当前数除尽为止。
若循环结束后m是大于1的正整数,那么此时的m也是n的素因子。
代码如下:
void divide(int n)
{
int i,count=0;
int factor[N];
for(i=2;i<=sqrt(n+0.0);i++)
{
while(n%i==0)
{
count++;
factor[count]=i;
n/=i;
}
}
if(n!=1)
{
count++;
factor[count]=n;
}
}
例题一:Eddy's research I
题目描述:Eddy 发现任何正整数都可以写成素数乘积的形式,但是他的C语言学得不好,你能帮他写一个程序实现上述功能吗。输入:输入数据有多组,每组数据占一行,包含一个整数1<x<=65535
输出:对应每组输入输出x的整数分解形式,具体见样例。
Sample Input
11
9412
Sample Output
分析:试除法的简单应用
11
2*2*13*181
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define N 10005
using namespace std;
void divide(int n)
{
int i,count=0;
int factor[N];
for(i=2;i<=sqrt(n+0.0);i++)
{
while(n%i==0)
{
count++;
factor[count]=i;
if(count!=1)
printf("*");
printf("%d",i);
n/=i;
}
}
if(n!=1)
{
count++;
factor[count]=n;
if(count!=1)
printf("*");
printf("%d",n);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
divide(n);
printf("\n");
getchar();
}
return 0;
}
筛选法对整数进行分解:
显然试除法进行了许多不必要的试除运算,如果首先将2到 根号n的所有素数打表,然后对应素数表一一试除将会大大节省时间。
算法设计:令m=n,将2到 根号n 的素数进行打表,然后对素数进行一一试除。如果能够整除m,那么当前数就是n的素数因子,并用整数m将当前数除尽为止。
若循环结束后,m是大于1的整数,那么此时m也为n的素数因子
模板代码如下
int prime[N];/// 存储素数
int nprime;///记录素数的个数
bool isprime[N];
void make_prime()
{
int i,j;
nprime=0;
memset(isprime,1,sizeof(isprime));
isprime[1]=0;
for(i=2;i<=sqrt(N);i++)
{
if(isprime[i])
{
nprime++;
prime[nprime]=i;
for(j=i*i;j<N;j+=i)
{
isprime[j]=0;
}
}
}
}
void divide(int n)
{
int i,count=0;
int factor[N];
int temp=sqrt(n+0.0);
for(i=1;i<=nprime;i++)
{
if(prime[i]>temp)
break;
while(n%prime[i]==0)
{
count++;
factor[count]=prime[i];
n/=prime[i];
}
}
if(n!=1)
{
count++;
factor[count]=n;
}
}
例题二:利用筛选法实现例题一的代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#define N 65536
using namespace std;
int prime[N];///存储素数
int nprime;///记录素数的个数
bool isprime[N];///记录是否为素数
void make_prime()
{
int i,j;
nprime=0;
memset(isprime,1,sizeof(isprime));
isprime[1]=0;
for(i=2;i<=sqrt(N);i++)
{
if(isprime[i])
{
nprime++;
prime[nprime]=i;
for(j=i*i;j<N;j+=i)
{
isprime[j]=0;
}
}
}
}
void divide(int n)
{
int i,count=0;
int factor[N];
int temp=sqrt(n);
for(i=1;i<=nprime;i++)
{
if(prime[i]>temp)
break;
while(n%prime[i]==0)
{
count++;
factor[count]=prime[i];
n/=prime[i];
if(count!=1)
printf("*");
printf("%d",prime[i]);
}
}
if(n!=1)///并非每个数都执行这一步
{
count++;
factor[count]=n;
if(count!=1)
printf("*");
printf("%d",n);
}
}
int main()
{
int n;
make_prime();
while(scanf("%d",&n)!=EOF)
{
divide(n);
printf("\n");
getchar();
}
return 0;
}