思路:给一个数n,是否只有4个约数(包括1),也就是找3个大于1的约数。
而任何一个数都可由质数表示,所以对于给定的数,只需要进行质因数分解。这里有
2种情况:如果有3个一样的质因数,则满足条件;否则只需要2个不同的质因子。
代码如下:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define pi acos(-1.0)
#define MAX 5000001
using namespace std;
ll n,e[];
int prime[MAX],cnt;
bool f[MAX];
void init()
{
int i,j;
cnt=;
for(i=;i<MAX;i++){
if(f[i]==) prime[cnt++]=i;
for(j=;j<cnt&&i*prime[j]<MAX;j++){
f[i*prime[j]]=;
if(i%prime[j]==) break;
}
}
}
void solve()
{
ll i;
ll num=n,k=;
for(i=;i<cnt&&prime[i]*prime[i]<=n;i++){
while(n%prime[i]==){
e[k++]=prime[i];
n/=prime[i];
}
if(k>){
cout<<"is not a D_num"<<endl;
return;
}
}
if(n>) e[k++]=n;
if(k>||k<){
cout<<"is not a D_num"<<endl;
return;
}
else if(k==){
if(e[]==e[]&&e[]==e[]){
cout<<e[]<<' '<<e[]*e[]<<' '<<num<<endl;
return;
}
else {
cout<<"is not a D_num"<<endl;
return;
}
}
else{
if(e[]==e[]){
cout<<"is not a D_num"<<endl;
return;
}
else{
cout<<e[]<<' '<<e[]<<' '<<num<<endl;
return;
}
}
}
int main(){
init();
while(cin>>n){
solve();
}
return ;
}