【牛客】素数判断

题面:链接: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值