对于因子和阶乘问题的理解

原创 2015年07月08日 23:48:05

因子和阶乘讨论的是这样的一个问题:

输入正整数n(2<=n<=100),把阶乘n! = 1x2x3x4x5...xn分解成素因子相乘的形式,从小到大输出各个素数(2、3、5、...)的指数。例如:825=3x5^2x11应表示成(0 1 2 0 1)

表示分别有0、1、2、0、1个2、3、5、7、11。程序应忽略比最大素因子更大的素数(否则末尾会有无穷多个0)

先贴上代码:

#include <stdio.h>
#include <string.h>
//素数判定,注意:n不能太大
int is_prime(int n)
{
	for(int i = 2;i*i <= n; i++)
		if(n % i == 0) return 0;
	return 1;
}
//存放素数
int prime[100],count = 0;
int main()
{
	//存放n和各个素数的指数
	int n,p[100];			
	//构造素数表
	for(int i = 2; i <= 100; i++)
		if(is_prime(i)) prime[count++] = i;
	//count 表示100以内素数的个数 24
	while(scanf("%d",&n) == 1)
	{
		printf("%d! =",n);
		memset(p,0,sizeof(p));
		int maxp = 0;
		for(int i = 1;i <= n; i++)
		{
			//必须把i复制到m中,而不要在做除法时修改它
			int m = i;
			for(int j = 0; j < count; j++)
				while(m % prime[j] == 0)	//m如果能够被prime[j]整除,说明素数prime[j]是m的一个因子。
				{
					m /= prime[j];		   //反复除以prime[j],直到素数prime[j]不能被m整除
					p[j]++;				   //指数累加
					if(j > maxp) maxp = j; //更新最大素因子下标
				}
		}
		//只循环到最大下标
		for( i = 0; i <= maxp; i++ )
		{
			printf(" %d",p[i]);
		}
		printf("\n");
	}
	return 0;
}

一直不理解都没有求出阶乘,怎么就可以求出素因子和素因子的指数的。

原来问题的关键在于m也就是i是每次相乘的一个因子,程序在while(m % prime[j] == 0)做这个判断的时候其实就是在判断prime[j]是否为m的一个因子,如果是m的因子,那肯定也是阶乘积的因子。p[j]只有累加的操作,不会被重置,也就是说相同的因子指数会被加在一起。比如m=2,prime[0] = 2的时候,这个时候p[0] = 1。当程序运行到m=4 ,prime[0] = 2的时候,这个时候会有两次m /= prime[j]; p[0]也会自加两次,得到p[0] = 3。其它地方的处理是一样的 。通过这种方式,求出了素因子的指数。

版权声明:本文为博主原创文章,未经博主允许不得转载。

工大C++ 精品课程上机考(第三题) - 阶乘中含因子2的个数

这题刚开始想的时候,是觉得只要计算偶数,比如5!,只要考虑2,4中含有因子2的个数,再加起来。但看到“输入一个整数n(n 其实可以这样考虑,比如计算8!,其中含有2因子的有三种,一种是只含有因子2(2...

POJ 2992 Divisors (快速求阶乘的素因子)

题目意思很明确, 就是求C(k , n) (0 ≤ k ≤ n ≤ 431)的因子个数,保证答案不会超long long。很容易想到用唯一分解定理来求解 , 想办法将C(k , n)变为 p1^...

NYOJ 509 因子和阶乘

因子和阶乘 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给你一个正整数n,把n!=1x2x3x.....xn分解成素因子相乘的形式,并从小到大输出...

算法竞赛入门经典5.4.2因子和阶乘

//“除非n太太太大了,否则都可运行”的版本 #include #include #include bool isPrime(int x){ int m = floor(sqrt(x + 0....
  • icedes
  • icedes
  • 2014年05月03日 21:12
  • 316

阶乘因子和

题目描述 给你一个正整数n,把n!=1x2x3x.....xn分解成素因子相乘的形式,并从小到大输出每个素因子的指数,但要保证最后输出的素因子个数不为0。例如825应表示为0,1,2,0,1表示...
  • ly59782
  • ly59782
  • 2015年11月13日 18:51
  • 284

算法竞赛入门经典:第五章 基础题目选解 5.10 因子和阶乘

/* 因子和阶乘: 输入正整数n(2

51nod 1189 阶乘分数 (分解质因子加上逆元,乘法逆元基本意思)

1/N! = 1/X + 1/Y(0 < x

习题 47:因子分解阶乘版★

题目描述: 给你一个小于10000的非负整数n,然后对n!的结果进行因子分解 输入: 多组测试数据,每行就是数值n 输出: 输出分解结果,详见样例 样例输入: 1...

POJ 1845 Sumdiv(求阶乘的因子和)

题目链接:http://poj.org/problem?id=1845

hdu3641 Treasure Hunting(灵活题,阶乘的素因子个数求法)

http://acm.hdu.edu.cn/showproblem.php?pid=3641 题意:有N个ai(aia1^b1*a2^b2*a3^b3…*an^bn ,求最小的 x 使得 x! % ...
  • cacyth
  • cacyth
  • 2015年10月31日 16:43
  • 521
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对于因子和阶乘问题的理解
举报原因:
原因补充:

(最多只允许输入30个字)