H106OJ_第二次测试_质数的后代:
提示:本文章为课程任务(学习记录)
本文章为课程第二次测试习题记录,仅供参考。
问题描述
题目:
如果一个合数由两个质数相乘而得,那么我们就叫它是质数们的直接后代。现在,给你一系列自然数,判断它们是否是质数的直接后代。
输入:
第一行一个正整数T,表示需要判断的自然数数量
接下来T行,每行一个要判断的自然数
输出:
共T行,依次对于输入中给出的自然数,判断是否为质数的直接后代,是则输出Yes,否则输出No。
样例:
这道题目要求和提示很清晰,不做分析。
思路:
这道题目的思路,题目已经给出了,只需要判断这个数是不是是形如质数×质数=目标数。
只不过这道题目,需要先筛选出所有的质数。然后遍历判断即可。代码中有一些需要注意的细节,列于分段分析中。
代码如下:
代码:
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n, x;
int cnt;
bool st[N];
int main()
{
for (int i = 2; i < N; i ++ )
{
if(!st[i])
for (int j = i + i; j < N; j += i)
st[j] = true;
}
cin >> n;
while(n --)
{
cin >> x;
cnt = 0;
for(int i = 2; i < x; i ++)
if(!st[i] && !(x%i))
if(!st[x/i])
cnt ++;
if(cnt) puts("Yes");
else puts("No");
}
return 0;
}
分段分析:
1. for (int i = 2; i < N; i ++ )
{
if(!st[i])
for (int j = i + i; j < N; j += i)
st[j] = true;
}
埃式筛法。不多赘述。
2.if(!st[i] && !(x%i))
判断当前这个数是不是质数,并且能否被目标数x整除。必须同时满足才可以进行下一步判断。
3.if(!st[x/i])
判断x/i是否为质数,如若是,则该数为直接质数。
Over,Bye~ 2022.03.26