关闭

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

80人阅读 评论(0) 收藏 举报
分类:

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

输入正整数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。其它地方的处理是一样的 。通过这种方式,求出了素因子的指数。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:902次
    • 积分:68
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档