5.2 筛法求素数

一个数,如果只有1和它本身两个 因数 ,这样的数叫质数(或素数)。如2、3、5、7都是质数。 
一个数,如果除了1和它本身还有别的因数,这样的数叫 合数 。如4、6、15、49都是合数。 
1既不是质数,也不是合数。 
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int n;
	cin >> n;
	cout << 2 << endl;
	for(int i = 3; i <= n; i += 2)//i += 2删除偶数的情况 
	{
		int j;
		for(j = 3; j < i; j += 2)//j += 2 奇数的因子不可能为偶数,为奇数 
		{
			if(i % j == 0) break;
			if(j * j > i) break;//j大于i的平方根后,另一个因子肯定小于i的平方根,已经计算过了	
		}
		if(j * j > i) 
			cout << i << endl;
	}
	return 0;
}
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
	int n;
	cin >> n;
	cout << 2 << endl;
	for(int i = 3; i <= n; i += 2)//i += 2删除偶数的情况 
	{
		int j;
		for(j = 3; j < sqrt(i); j += 2)//j += 2 奇数的因子不可能为偶数,为奇数 
		{
			if(i % j == 0) break;
		}
		if(j > sqrt(i))
			cout << i << endl;
	}
	return 0;
}





整型在字符数组中的存储

其实整型在字符数组中的存储,就是将值转化成ASCII值进行存储,类似于哈希表的方式,一个键对应一个值,

我们只需要找到它的键,进而取出它的值即可使用。

所以我们不用担心整型存储到字符数组中会变成字符型,因为我们存储的是整型所对应的ASCII值,而不是整型本身。
#include<iostream>
#define MAXN 10000000
using namespace std;
char isprime[MAXN+10];//不用int型,int类型占用4个字节,char占用1个字节。
//MAXN至少+1,数组下标是从0开始的,所以如果不+1,最大为a[MAXN-1] 
int main()
{
	int n;
	cin >> n;
	for(int i = 2; i <= n; ++i)
		isprime[i] = 1;//1表示isprime[i]为素数
	for(int i = 2; i <= n; ++i)
	{
		if(isprime[i])//判断如果已经是合数就不必再计算了 
		{
			for(int j = 2 * i; j <= MAXN; j += i)//注意为j+=i,表示增加i步长即每次增加一倍 
			{
				isprime[j] = 0;//倍数即为合数 
			}
		}
	} 
	for(int i = 2; i <= n; ++i)
	{
		if(isprime[i])
		{
			cout << i << endl;
		}
	} 
	return 0;	 
} 


猜你喜欢

转载自blog.csdn.net/yanyanwenmeng/article/details/81045634
5.2