一刷:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <map>
#include <cstdio>
using namespace std;
int main(){
int n,k=0;
int prime[30]={0};
for(int i=2;i<=100;i++){
int tag=1;
for(int j=2;j*j<=i;j++){
if(i%j==0){
tag=0;
break;
}
}
if(tag)
prime[k++]=i;
}
while(scanf("%d",&n)!=EOF){
map <int,int> Map;
long sum=1;
for(int i=1;i<=n;i++){
sum*=i;
for(int j=0;j<k;j++){
while(sum%prime[j]==0){
sum/=prime[j];
Map[prime[j]]++;
}
}
}
cout<<n<<"!=";
for(int j=0;j<=k;j++){
if(prime[j]>n)
break;
cout<<" "<<Map[prime[j]];
}
cout<<endl;
}
return 0;
}
二刷:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
bool prime(int n){
for(int i=2;i*i<=n;i++){
if(n%i==0)
return 0;
}
return 1;
}
int main(){
int n,k=0;
int p[30];
for(int i=2;i<100;i++){
if(prime(i)){
p[k++]=i;
}
}
map<int,int>MAP;
while(cin>>n){
int s=1;
MAP.clear();
for(int i=n;i>1;i--){
s*=i;
for(int j=0;j<k;j++){
while(s%p[j]==0&&s>1){
MAP[p[j]]++;
s/=p[j];
}
if(s==1)
break;
}
}
int ed;
for(int i=k-1;i>=0;i--){
if(MAP[p[i]]>0){
ed=i;
break;
}
}
cout<<n<<"!=";
for(int i=0;i<=ed;i++){
printf(" %d",MAP[p[i]]);
}
cout<<endl;
}
return 0;
}

这段代码实现了一个计算n的阶乘并分解其中素数的过程。首先通过筛法找到100以内的所有素数,然后对于每个输入的n,计算其阶乘并用素数分解阶乘结果,输出阶乘表示形式。
9686

被折叠的 条评论
为什么被折叠?



