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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值