14 語言入門 14 階乘因式分解(一)

2021-06-29 05:55:20 字數 1330 閱讀 5696

描述

給定兩個數m,n,其中m是乙個素數。

將n(0<=n<=10000)的階乘分解質因數,求其中有多少個m。

輸入 第一行是乙個整數s(0輸出

輸出m的個數。

樣例輸入

2 100 5

16 2

樣例輸出

24 15

補充知識:

階乘指從1乘以2乘以3乘以4一直乘到所要求的數。例如所要求的數是4,則階乘式是1×2×3×4,得到的積是24,24就是4的階乘。分解質因數:舉個簡單例子,12的分解質因數可以有以下幾種:12=2x2x3=4x3=1x12=2x6,其中1,2,3,4,6,12都可以說是12的因數,即相乘的幾個數等於乙個自然數,那麼這幾個數就是這個自然數的因數。2,3,4中,2和3是質數,就是質因數,4不是質數。那麼什麼是質數呢?就是不能再拆分為除了1和它本身之外的因數的數,如2,3,5,7,11,13,17,19,23,29等等,質數沒有什麼特定的規律,不存在最大的質數。

這裡的質數也就是題目中說的素數

思路:

給定兩個數m,n

求m!分解質因數後因子n的個數。

這道題涉及到了大數問題,如果相乘直接求的話會超出資料型別的範圍。

下面給出一種效率比較高的演算法,我們一步一步來。

m!=1*2*3*……*(m-2)*(m-1)*m

可以表示成所有和n倍數有關的乘積再乘以其他和n沒有關係的

=(n*2n*3n*......*kn)*ohter     other是不含n因子的數的乘積   因為 kn<=m 而k肯定是最大值  所以k=m/n

=n^k*(1*2*......*k)*other 

=n^k*k!*other    

從這個表示式中可以提取出k個n,然後按照相同的方法迴圈下去可以求出k!中因子n的個數。

每次求出n的個數的和就是m!中因子n的總個數。

**:#include

int main()

while(n != 0);

printf("%d\n",resultnum);

--readlen;

} return 0;

}#include

using namespace std;

int get(int n,int num)

int main()

{ int n;

cin>>n;

while(n--)

{ int a,b;

cin>>a>>b;

cout《總結:本題目重在理解分解質因數的概念。是採用迭代還是遞迴,目前水平還分不出哪種方法更有優勢。感覺計算量應該是一樣的。

階乘因式分解(一)

描述 給定兩個數m,n,其中m是乙個素數。將n 0 n 10000 的階乘分解質因數,求其中有多少個m。輸入 第一行是乙個整數s 0 100 表示測試資料的組數 隨後的s行,每行有兩個整數n,m。輸出 輸出m的個數。樣例輸入 2 100 5 16 2 樣例輸出 24 15 階乘指從1乘以2乘以3乘以...

階乘因式分解(一)

描述 給定兩個數m,n,其中m是乙個素數。將n 0 n 10000 的階乘分解質因數,求其中有多少個m。輸入 第一行是乙個整數s 0 s 100 表示測試資料的組數 隨後的s行,每行有兩個整數n,m。輸出 輸出m的個數。樣例輸入 2 100 5 16 2 樣例輸出 24 15 演算法思路 由於m是乙...

階乘因式分解(一)

時間限制 3000 ms 記憶體限制 65535 kb 難度 2描述 給定兩個數m,n,其中m是乙個素數。將n 0 n 10000 的階乘分解質因數,求其中有多少個m。輸入 第一行是乙個整數s 0 輸出輸出m的個數。樣例輸入 2 100 5 16 2 樣例輸出 24 關鍵 while n 完整 in...