#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;
}
}
因子和阶乘
最新推荐文章于 2023-10-04 20:38:36 发布