zoukankan      html  css  js  c++  java
  • 求一个数的约数个数 d(n)

    ·方法一

    ·方法二

    ·时间测试

    方法一:筛法

    for(int i = 1; i <= n; ++i)
        for(int j = 1; i * j <= n; ++j)
            d[i * j]++;

    方法二:质因数分解

    若A|B 则

    a1<=b1,a2<=b2···an<=bn (a,b分别指正数A,B的质因数)

    则A可取 (0~a1)*(0~a2)*···*(0~an)

    即 (a1+1)*(a2+1)*···*(an+1)

    #include <cstdio>
    #include <cstring>
    #define N 100001
    
    int n,p;
    bool mark[N];
    int prime[N];
    
    void get_prime(){
        for(int i = 2; i <= N;++i){
            if(!mark[i]) prime[++p] = i;
            for(int j = 1; j <= p; ++j){
                if(i * prime[j] > N) break;
                mark[i * prime[j]] = true;
                if(i % prime[j] == 0) break;
            }
        }
    }
    
    int get(int n1){
        int w1[N];
        memset(w1, 0, sizeof(w1));
        for(int i = 1; prime[i] <= n1; ++i){
            while(n1 % prime[i] == 0){
                w1[i]++;
                n1 = n1 / prime[i];
            }
        }
        int ans = 1;
        for(int i = 1; i <= p; ++i) ans = ans * (w1[i] + 1);
        return ans;
    }
    
    int main(){
        get_prime();
        printf("%d", get(36));
        //for(int i = 1; i <= p; ++i) printf("%d ", prime[i]);
        return 0;
    }

     时间测试:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int N = 100001;
    
    int n,p;
    int prime[N],mark[N],d[N];
    
    void od(){
        for(int i = 1; i <= n; ++i){
            for(int j = 1; i * j <= n; ++j){
                d[i * j]++;
            }
        }
        /*for(int i = 1; i <= n; ++i){
            for(int j = 1; i * j <= n; ++j){
                d[i * j].push_back(i);//约数 
            }
        }
        for(int i = 1; i <= n; ++i){
            for(int j = 1; i * j <= n; ++j){
                d[i * j] += i;           //约数和 
            }
        }
        for(int i = 1; i <= n; ++i){
            for(int j = 2; i * j <= n; ++j){
                d[i * j] += i;           //约数和(不包自身) 
            }
        }*/
    } 
    
    void get_prime(){
        for(int i = 2; i <= n; ++i){
            if(!mark[i]) prime[++p] = i;
            for(int j = 1; j <= p; ++j){
                if(i * prime[j] > n)  break;
                mark[i * prime[j]] = 1;
                if(i % prime[j] == 0) break;
            }
        }
    }
    
    int od1(){
        int w1[N];
        int pp = 0, n1 = n;
        for(int i = 1; i <= p && prime[i] <= n1; ++i){
            if(n1 % prime[i] == 0) w1[++pp] = 0;
            while(n1 % prime[i] == 0){
                n1 /= prime[i];
                w1[pp]++;
            }
        }
        int ans = 1;
        for(int i = 1; i <= pp; ++i) ans *= w1[i] + 1;
        return ans;
    }
    
    int main(){
        clock_t start, end;
        n = 99999;
        cout << "n = " << n << endl;
        
        start = clock();
        od();
        end = clock();
        cout << "筛法时间:" << (double)(end - start) / CLOCKS_PER_SEC << "" << endl; 
        cout << "d(n) = " << d[n] << endl;
        
        start = clock();
        get_prime();
        int ans = od1();
        end = clock();
        cout << "质因数分解时间:" << (double)(end - start) / CLOCKS_PER_SEC << "" << endl;
        cout << "d(n) = " << ans << endl;
        
        return 0;
    }

     

     

  • 相关阅读:
    Swift语法基础: 20
    Swift语法基础:19
    Swift语法基础:18
    Swift语法基础:17
    Swift语法基础:16
    Swift语法基础:15
    Swift语法基础:14
    Swift语法基础:13
    Swift语法基础:12
    Swift语法基础:11
  • 原文地址:https://www.cnblogs.com/Adventurer-H/p/10872149.html
Copyright © 2011-2022 走看看