整数分解普通分法【学习笔记】

定义:给出一个正整数,将其携程几个素数的乘积,这个过程称为整数分解。

例题:HDU_1164 https://vjudge.net/problem/HDU-1164

一、试除法

算法:令m = n,从2~sqrt(N) 一一枚举,如果当前数能够整除m,那么当前数就是n的素因子,并用整数m将当前数除尽为止。若循环结束后m是大于1的整数,那么此时的m也是n的素因子。

代码:

#include <bits/stdc++.h>

using namespace std;
int Factor[100], Cnt;

void Divide(int N)
{
    Cnt = 0;
    for(int i = 2; i <= sqrt((double)N); i++)
    {
        while(N%i == 0)
        {
            Factor[Cnt++] = i;
            N/=i;
        }
    }
    if(N!=1)
        Factor[Cnt++] = N;
}

int main()
{
    int N;
    while(~scanf("%d", &N))
    {
        Divide(N);
        for(int i = 0; i < Cnt-1; i++)
            cout << Factor[i] <<"*";
        cout << Factor[Cnt-1] <<  endl;
    }
}

  

二、筛选法对整数分解

算法:因为试除法进行了很多不必要的试除运算,如果首先将2~sqrt(n) 的所有素数打表,然后对应素数表一一试除将会大大节省时间。

代码:

#include <bits/stdc++.h>

using namespace std;
const int MAXN = 65536;
int Factor[100], Cnt;
int Prime[MAXN], nPrime;
bool isPrime[MAXN];

void getPrime()
{
    memset(isPrime, 1, sizeof(isPrime));
    isPrime[0] = isPrime[1] = 0;
    nPrime = 0;
    for(int i = 2; i*i <= MAXN; i++)
    {
        if(isPrime[i])
        {
            Prime[nPrime++] = i;
            for(int j = i+i; j < MAXN; j+=i)
            {
                isPrime[j] = 0;
            }
        }
    }
}

void Divide(int n)
{
    Cnt = 0;
    for(int i = 0; i < nPrime; i++)
    {
        if(Prime[i] > n)    break;
        while(n%Prime[i] == 0)
        {
            Factor[Cnt++] = Prime[i];
            n/=Prime[i];
        }
    }
    if(n!=1)
    {
        Factor[Cnt++] = n;
    }

}

int main()
{
    int D;
    getPrime();

    while(~scanf("%d", &D))
    {
        Divide(D);
        for(int i = 0; i < Cnt-1; i++)
            cout << Factor[i] <<"*";
        cout << Factor[Cnt-1] <<  endl;
    }
}

  

posted @ 2018-10-04 10:34  Dybala21  阅读(614)  评论(0)    收藏  举报