数论整理之唯一质因子分解方程

唯一质因子分解方程

每个大于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;
}
发布了60 篇原创文章 · 获赞 22 · 访问量 6972

猜你喜欢

转载自blog.csdn.net/weixin_43786143/article/details/89761889