【阶乘约数】

题目概述:

【阶乘约数】_第1张图片

解题分析:

【阶乘约数】_第2张图片

自己理解:

本来一直不太能理解是怎么操作的,昨天晚上看了一些其他博主的介绍,此时才明白,现在将自己的理解写出来,如果有不对的地方,还请大家指出

就是一个数等于若干个质因数相乘的结果,示例如下:

18 = 2*3*3:2 和 3 都是质数

55 = 5*11:5 11 都是质数

180 = 2*2*3*3*5:2 3 5 都是质数

那么知道某个数的质因数以及其个数时,我们便可以计算出该数有几个因子(约数),示例:

18:由一个2,两个三相乘,所以约数个数有:(1+1)*(2+1) =  6

55:由一个5,一个11相乘,所以约数个数有:(1+1)*(1+1)= 4 

180:由两个2,两个3,一个5相乘,所以约数个数有:(2+1)*(2+1)*(1+1) = 18

所以该题的解题思路就是:

将100!阶乘中的1、2、3、4、...99、100中的每一个数全部转化为质因数相乘的形式,然后按照上述定理即可计算出其约数个数!注意:如果乘积中有1不用计算

以5!为例:

5!=1*2*3*4*5=1*2*3*2*2*5

因子个数为:(3+1)*(1+1)*(1+1)= 16

【阶乘约数】_第3张图片

题解代码:

代码实现100!有多少个正约数!

//阶乘约数 
#include 

using namespace std;

long long int num[110];
int main()
{
	for(int i=2;i<=100;++i){
		//对每一个数进行分解质因数
		int pos = 2, temp = i;
		while(true)
		{
			if(temp % pos == 0)   //如果这个数除pos余0,那么 pos 是他的一个约数,那么此时 pos 的个数就加一 
			{
				num[pos]++;
		    	temp /= pos;   //此时临时变量需要更新; 
		    	if(temp == 1)
		    		break;     //循环结束条件 
			}
			else 
				pos++;
		}
	}
	long long int ans = 1;
	//已经全部计算完毕
	for(int i = 2;i <= 100;++i){
		if(num[i] != 0)
			ans *= (num[i]+1);
	}
	printf("%lld",ans);
	return 0;
} 

欢迎大家在评论区交流

你可能感兴趣的:(程序设计与算法,算法,c++,蓝桥杯,简单数论)