【商汤2018-10-15在线笔试】寻找半素数

版权声明:本文为阿木寺的原创文章,未经本人允许不得转载。 https://blog.csdn.net/amusi1994/article/details/83065357

题目描述

数学中,两个素数的乘积所得的自然数我们称之为半素数。
现在我们给定一个数N,我们想要得到小于或等于N的半素数的数目。

在这里插入图片描述

在这里插入图片描述

代码

#include <bits/stdc++.h>

using namespace std;
vector<int> v;
set<int> s;

void ChoosePrime(int a, int b)//建立[a,b]范围内的素数表
{
	for (int i = a; i <= b; i++)
	{
		//2是素数,这里是2的倍数
		if (i != 2 && i % 2 == 0) continue;
		// 判断其它数值是不是素数(不要考虑2的倍数)
		for (int j = 3; j*j <= i; j += 2)
		{
			if (i%j == 0) goto RL;
		}
		v.push_back(i);
	RL:continue;
	}
}
int main()
{
	int n;
	cin >> n;
	ChoosePrime(2, 500000);//建立[2,500000]范围内的素数表
	int i, j, p;
	for (i = 0; i<v.size(); i++)//建立[2,1000 000]范围内的半素数表
	{
		for (j = 0; j<v.size(); j++)
		{
			p = v[i] * v[j];//两个素数相乘
			if (p<=n) s.insert(p);
			else break;
		}
	}
	//读入数据,在半素数表中查找,看是否在该表中
	cout << s.size()<< endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/amusi1994/article/details/83065357
今日推荐