0
点赞
收藏
分享

微信扫一扫

H106OJ_第二次测试_质数的后代

guanguans 2022-03-26 阅读 62
c++

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

举报

相关推荐

H106OJ_第二次测试_淘淘的名单

H106OJ_第二次练习_幸运数

H106OJ第二次练习

H106OJ_第二周总结

H106OJ_第三次练习_去注释

第二次网页

第二次作业

HCIP第二次实验

第二次java学习

0 条评论