题解:1.首先了解一下题目的意思,给你T组测试用例,每组一个数n,让你把 n!写成质数的幂相乘的形式。
2.由唯一分解定理可知每个数都可以分解成若干个质数相乘,由于求 n!,我们可以从2到n依次遍历,求出每个数的分解结果。
3.我们可以建立一个数组md来存储对应的质数出现的次数(也就是质数的幂数),将这个数组初始化为0,遍历时分解出哪个质数,将其加一,最后注意每次输入n时,都要将md数组的所有元素重置为0。
4.注意输出结果的格式,特别是空格。
AC代码:
#include <iostream>
#include<cstring>
using namespace std;
int md[100],n,t,v;//n<=100
int main()
{
ios::sync_with_stdio(false);
cin>>t;
int cas=1;
while(t--)
{
cin>>n;
memset(md,0,sizeof(md));//初始化md的值为0
for(int i=2;i<=n;i++)//2到n遍历
{
v=i;//将i的值存起来,便于分解
for(int j=2;j*j<=v;j++)//分解
{
if(v%j==0)//有j这个因子
{
md[j]++;
v/=j;
while(v%j==0)//是否还有j这个因子
{
md[j]++;
v/=j;
}
}
}
if(v>1)//如果大于1,则为分解后的最后一个因子
{
md[v]++;
}
}
cout<<"Case "<<cas++<<": "<<n<<" = ";
cout<<"2"<<" ("<<md[2]<<')';
for(int i=3;i<=n;i++)
{
if(md[i])
{
cout<<" * "<<i<<" ("<<md[i]<<')';
}
}
cout<<endl;
}
return 0;
}