蓝桥杯——阶乘约数(CN练习记录)
【问题描述】
定义阶乘 n! = 1 × 2 × 3 × ··· × n。
请问 100! (100 的阶乘)有多少个约数。
【思路1】(一般思路)
任意一个正整数 X 都可以表示成若干个质数乘积的形式,即 X = p1α1 ∗ p2α2 …… ∗ pkαk
约数个数=(α1 + 1)(α2 + 1)……(αk + 1)
如180=2*2*3*3*5=2^2*3^2*5 则:180的约数个数为(1+2)*(1+2)*(1+1)=18个。
【思路2】(阶乘思路)来自https://blog.csdn.net/ji414341055/article/details/5759157
例如:20!
1.先求出20以内的素数,(2,3,5,7,11,13,17,19)
2.再求各个素数的阶数
e(2)=[20/2]+[20/4]+[20/8]+[20/16]=18;
e(3)=[20/3]+[20/9]=8;
e(5)=[20/5]=4;
e(7)=[20/7]=2;
e(11)=[20/11]=1;
e(13)=[20/13]=1;
e(17)=[20/17]=1;
e(19)=[20/19]=1;
所以 :20!=2^18*3^8*5^4*...*19^1 则:约数个数=19*9*5*3*2*2*2*2=???
【思路1题解代码】 来自https://blog.csdn.net/weixin_46239370/article/details/109707904 (巧妙,简单,厉害,膜拜!!!)
#include <iostream>
using namespace std;int p[100];
int main()
{
for (int i = 2; i <= 100; i ++)
{
int n = i;
for (int j = 2; j <= n / j; j ++) //从小的质数开始除,除不尽了再去除大的(大的一定是质数)
while(n % j == 0) //循环除以某个质数 直到除不尽(退出循环去除大的质数)
{
p[j] ++;
n /= j;
}
if(n > 1) p[n] ++;
}long long ans = 1;
for (int i = 2; i <= 100; i ++)
if(p[i]) ans *= (p[i] + 1);cout << ans << endl;
return 0;
}
【思路2题解代码】
#include<iostream>
#include<math.h>
#include<vector>
using namespace std;int main()
{int n;
long long ans=1;
int a[100]={0};
vector<int>b;
cin>>n;
int k=0;for(int i=2;i<=n;i++) //找质数 放入数组中
{ bool f=true;
for(int j=2;j<=sqrt(n);j++)
{
if(i%j==0&&j<i)
{
f=false;
}}
if(f)
{
b.push_back(i);
}
}
vector<int>b2(b);
int l=b.size();
for(int i=0;i<l;i++)
{
do{
a[i]+=n/b[i];
b[i]=b[i]*b2[i];
}while(b[i]<=n);
}
for(int i=0;i<l;i++)
{
ans=ans*(a[i]+1);
}
cout<<ans;
return 0;
}