唯一质因子分解方程
每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。
标称:
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
const int MAXN = 65540;
int a[MAXN];
int main(){
int n;
while(cin >> n && n){
int cnt = 0;
for(int i=2;i<=n;++i){
while(n % i == 0){
a[cnt++] = i;
n /= i;
}
}
for(int i=0;i<cnt-1;++i){
cout << a[i] << "*";
}
cout << a[cnt-1] << endl;
}
return 0;
}
one 试除法:无论素数判定还是因子分解,试除法(Trial Division)都是首先要进行的步骤。令m=n,从2~根n一一枚举,如果当前数能够整除m,那么当前数就是n的素数因子,并用整数m
将当前数除尽为止。
若循环结束后m是大于1的整数,那么此时m也是n的素数因子
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define N 65535
using namespace std;
int factor[N],top;
void divide(int n)
{
for(int i=2; i<=sqrt(n+0.0); i++)
{
while(n%i==0)
{
top++;
factor[top]=i;
n/=i;
}
}
if(n!=1)
{
top++;
factor[top]=n;
}
for(int i=1; i<=top-1; i++)
{
printf("%d*",factor[i]);
}
printf("%d\n",factor[top]);
return ;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
top=0;
divide(n);
}
return 0;
}
two:在试除法基础上加上筛法(埃氏筛),减少时间
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#define N 65540
using namespace std;
int factor[N],top,cnt,prime[N];
bool b[N];
void make_prime()
{
top=0;
b[0]=b[1]=false;
b[2]=true;
prime[++top]=2;
for(int i=3; i<N; i++)
if(i%2==0) b[i]=false;
else b[i]=true;
double t=sqrt(1000000*1.0);
for(int i=3; i<=t; i++)
{
if(b[i])
{
prime[++top]=i;
for(int j=i*i; j<N; j=j+i)
{
b[j]=false;
}
}
}
}
void divide(int n)
{
cnt=0;
int temp=sqrt(n+0.0);
for(int i=1; i<=top; i++)
{
if(prime[i]>temp)
break;
while(n%prime[i]==0)
{
cnt++;
factor[cnt]=prime[i];
n/=prime[i];
}
}
if(n!=1)
{
cnt++;
factor[cnt]=n;
}
for(int i=1; i<=cnt-1; i++)
{
printf("%d*",factor[i]);
}
printf("%d\n",factor[cnt]);
return ;
}
int main()
{
int n;
make_prime();
while(scanf("%d",&n)!=EOF)
{
divide(n);
}
return 0;
}