题面:链接:https://ac.nowcoder.com/acm/contest/26656/1001
来源:牛客网
给出一个数x,判断它是否为素数,并输出所有它的素因子。
输入描述:
第1行输入组数T,代表有T组数据。
第2-T+1行每行输入一个数x表示对应询问。
数据保证:2≤x≤109
输出描述:
对于每组询问输出两行表示结果。
第1行,如果x是素数,输出“isprime”(不含双引号),否则输出“noprime”(不含双引号)。
第2行,输出x的素因子。
//对于本题 思路就是
1:将sqrt(1000000000)素数筛出来存入素数表;
2:对于素数直接判断加输出;
3:对于非素数,将非素数逐步除以素数表,这里可以发现,其实素数表存的素数已经可以将10e9内的数分成几个质数相乘了,但是会发现有些数1000000072这种并不能分成sqrt(1000000000)内的质数相乘,但是发现,这类数据可以被小质数除以后,将除数判断如果是素数,就输出并且停止,不是则继续,ok,就这样A了, 时间复杂度大概Tlog(n)log(n);
#include<bits/stdc++.h>
using namespace std;
int a[1000000];
int prime(long long n){
for(int i=2;i<=sqrt(n);i++)
if(n%i==0) return 0;
return 1;
}
void ouput(long long n){
cout<<"noprime"<<endl;
int pos=1;
while(n!=1){
int flag=0;
while(n%a[pos]==0&&n){
flag=1;
n/=a[pos];
}
if(flag) cout<<a[pos]<<" ";
if(!prime(n)||n==1) pos++;
else {cout<<n<<endl;break;}
}
cout<<endl;
}
int main()
{
int k=1;
for(int i=2;i<=1000000;i++){
if(prime(i)) a[k++]=i;
}
long long t,n;
cin>>t;
while(t--){
cin>>n;
if(n==2||n==3) cout<<"isprime"<<endl<<n<<endl;
else if(prime(n)) cout<<"isprime"<<endl<<n<<endl;
else ouput(n);
}
return 0;
}