【小算法】求約數個數

約數個數及證明

從小學數學開始?
什麼是約數:如果一個整數能被兩個整數整除,那麼這兩個數是這個數的約數。

一個數的約數的個數=這個數的所有質因子的次數+1的乘積。

例如:48=2^4*3
48的約數的個數=(4+1)*(1+1)=10

證明:(來自權限chairman)

2^0*3^0
2^0*3^1
2^0*3^2
……
2^1*3^0
2^1*3^1
……
2^2*3^0
……
2^x*3^0
……
2^x*3^y
舉個栗子:
6
2^0 3^0
2^0 3^1
2^1 3^0
2^1 3^1
——>4
10(2^1*5^1)
2^0 5^0
2^0 5^1
2^1 5^0
2^1 5^1
——>4
12(2^2*3^1)
2^0 3^0
2^0 3^1
2^1 3^0
2^1 3^1
2^2 3^0
2^2 3^1
——>6
根據乘法原理 2一共有x+1個冪 3有y+1個冪 所以就是(x+1)*(y+1)個因子

根據唯一分解定理可知,每個大於1的數一定可以以唯一的方式被分解爲若干個素數的乘積。
通過計算發現一個2000000000以內的數字不會有超過12個素因子,數據範圍更大的話可以再乘。
計算某個數的約數個數時,先打表預處理出從2開始的12個素數,然後一直除。
以下代碼只體現性質,實際處理質因子次數時好像可以用篩法快速解決。

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=101;
struct node
{
    int a,k;
}s[maxn];
int n,ans=1;
int main()
{
    scanf("%d",&n);
    s[1].a=2,s[2].a=3,s[3].a=5,s[4].a=7,s[5].a=11,s[6].a=13,s[7].a=17,s[8].a=19,s[9].a=23,s[10].a=29,s[11].a=31,s[12].a=37;
    int x=n;
    for(int i=1;i<=x;i++)
    {
        while(x%s[i].a==0)
        {
            s[i].k++;
            x/=s[i].a;
        }
    }
    for(int i=1;i<=n;i++)
    {
        ans*=s[i].k+1;
    }
    cout<<ans<<'\n';
    return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章