数学1001 素数判断

链接: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

输入

复制
3
2
9
10

输出

复制
isprime
2
noprime
3
noprime
2 5

分析

写麻烦了, 如果用两个大于根号x 的因子,那这个数必然大于x ,所以只有一个大于根号x 的因子,把所有其它因子除完后剩下一个数如果大于1,就是x 的大于根号x 的因子。

不需要另外一个vector存所有因子

//-------------------------代码----------------------------

//#define int ll
const int N = 1e5+10;
int n,m;

void check(int x) {
  bool flag = 1;
  V<int>q;
for(int i = 2;i<= x/i;i++) {
if(x % i == 0) {
  flag = 0;
  q.pb(i);
  while(x % i == 0) {
    x /= i;
  }
  int tmp = x/i;
  if(tmp > 1 && x % tmp == 0)q.pb(tmp);
}
}
if(x>1) {
  q.pb(x);
}
if(flag) {
  cout<<"isprime"<<endl;
  cout<<x<<endl;
} else {
  cout<<"noprime"<<endl;
  sort(all(q));
  q.erase(unique(all(q)),q.end());
  for(auto t:q) {
  cout<<t<<' ';
}
cout<<endl;
}
}

void solve()
{
cin>>n;
check(n);
}

signed main(){
clapping();TLE;

int t;cin>>t;while(t -- )
solve();
// {solve(); }
return 0;
}

/*样例区


*/

//------------------------------------------------------------

 

posted @ 2022-07-24 17:03  er007  阅读(100)  评论(0编辑  收藏  举报