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

本文详细介绍了整数分解的两种常见算法:试除法和筛选法。试除法通过从2到sqrt(N)枚举所有可能的素数因子进行分解,而筛选法则先生成素数表,再利用该表进行高效分解。文中提供了完整的C++代码实现。

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

例题: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;
    }
}

  

转载于:https://www.cnblogs.com/dybala21/p/9741721.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值