zoukankan      html  css  js  c++  java
  • 整数分解普通分法【学习笔记】

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

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

      

  • 相关阅读:
    04-增删改查
    03-编写dao实现类方式
    02-基于注解的入门案例
    .net core api 图片上传与加载
    笔记一、数据库初始化 约定
    .net core MVC中级教程(四)
    .net core MVC中级教程(三)
    Windows 盘符映射
    c# 队列和堆栈
    isValidNode
  • 原文地址:https://www.cnblogs.com/dybala21/p/9741721.html
Copyright © 2011-2022 走看看