因子和阶乘


#include <iostream>
#include <string.h> 
using namespace std;
int a[25]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};//100以内的阶乘,可写出包含的素数组成的数组 
//方法一 :先将n!的每一位都对一个素数进行运算分解,当分解得到的数目不变时,停止对该素数的分解,再进入下一个素数的分解 

int b[25],c[100];//b用来存储对应a中素数的指数,c用来表示n的阶乘中的n个数 
int main()
{
	int n;
	while(cin>>n)
	{
		memset(b,0,sizeof(b));//每次循环前都要清除上一次的数据 
		memset(c,0,sizeof(c));
		for(int i=0;i<n;i++) 	c[i]=i+1;//将n!中的数转换到数组中 
		for(int i=0;i<25;i++)
		{
			int count=0;
			while(1)
			{
				int x=b[i];//保存对a[i]对应素数的指数 
				for(int j=0;j<n;j++)//遍历数组,当能够分解时,b[i]自增,c[j]也要变化 
			    {
				    if(c[j]%a[i]==0){
				     	b[i]++;c[j]=c[j]/a[i];
				    }
			    }
			    if(x==b[i]) break;//当指数不再变化,即无法继续分解时,跳出死循环,进入下一个素数的分解 
			}
		}
		cout<<n<<"!=";
		for(int k=0;k<25&&b[k];k++) cout<<b[k]<<" ";//忽略指数为0的素数进行输出 
		cout<<endl;
	}
}
*/

//方法二:先将n!中的一位对每一个素数进行分解,到无法继续分解时,再对n!中下一个数进行运算
//这里对上面进行一点优化,直接用数字进行运算,而不用数组  
int b[25];
int main()
{
	int n;
	while(cin>>n)
	{
		memset(b,0,sizeof(b));//清除数据 
		for(int i=2;i<=n;i++)
		{	
		    int m=i;//先将循环所在的i保存 
			for(int j=0;j<25;j++)
			{//对每个素数取余,当无法被整除时,退出while循环,进入下一个素数的运算 
				while(m%a[j]==0) {
					m=m/a[j];b[j]++;//b仍保存对应素数的指数 
				}
			 } 
		}
		cout<<n<<"!=";
		for(int k=0;k<25&&b[k];k++) cout<<b[k]<<" ";//输出 
		cout<<endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值