当前位置: 代码迷 >> 综合 >> LightOJ-1035(唯一分解定理)c++
  详细解决方案

LightOJ-1035(唯一分解定理)c++

热度:74   发布时间:2024-02-05 03:23:00.0

题解: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<=100int main()
{ios::sync_with_stdio(false);cin>>t;int cas=1;while(t--){cin>>n;memset(md,0,sizeof(md));//初始化md的值为0for(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;
}