学了一种新的素数筛,和以前的不一样哦!

求素数

Time Limit: 100ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

求小于n的所有素数的数量。

输入

多组输入,输入整数n(n<1000000),以0结束。

输出

输出n以内所有素数的个数。

示例输入

10
0

示例输出

4

提示

以这道题目为例,要找出n以内的素数, n<=1000000.

为了节省时间,用素数筛 先把1000000以内的素数全部标记出来!

此素数筛核心算法代码:

这样跑完这个代码,是素数的会标记为0, 不是素数的标记为1。  数据处理完毕!

	int f[1000004];
	int i, j;
	memset(f, 0, sizeof(f));

    f[1]=1 ;  //标记1的不是素数  标记0的是素数
	i=2;
	while(i<=500000)
	{
		for(j=i*2; j<=1000000; j+=i )
		{
			f[j]=1;
		}
		i++;
		while(f[i]==1)
		{
			i++;
		}
	}
#include <stdio.h>
#include <string.h>

int f[1000004];

int main()
{
	int n;
	int i, j;
	memset(f, 0, sizeof(f));

    f[1]=1 ;  //标记不是
	i=2;
	while(i<=500000)
	{
		for(j=i*2; j<=1000000; j+=i )
		{
			f[j]=1;
		}
		i++;
		while(f[i]==1)
		{
			i++;
		}
	}

    int k, cnt;
	while(scanf("%d", &n) && n!=0 )
	{
		cnt=0;
        for(k=1; k<n; k++)
		{
         if(f[k]==0)
			 cnt++;
		}
		printf("%d\n", cnt );
	}
	return 0;
}
时间: 2024-10-11 21:39:10

学了一种新的素数筛,和以前的不一样哦!的相关文章

素数筛 模板

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 int prim[3000000]={2,3,5}; 8 //素数是分为基本素数{2,3}.阳素数{6N+1,N>=1}形式的.阴素数{6N-1,N>=1}形式的 9 //为了代码的好写,在这里这样写的 : 10 //数除了{2,3,5}为素数,其他的数可以写成6N,6N+1

ACdream 1112 Alice and Bob (sg函数的变形+素数筛)

题意:有N个数,Alice 和 Bob 轮流对这些数进行操作,若一个数 n=a*b且a>1,b>1,可以将该数变成 a 和 b 两个数: 或者可以减少为a或b,Alice先,问谁能赢 思路:首先单看对每个数进行除法的操作,我们可以知道其实是在除以每个数的素因子或素因子之间的积 比如 70=2*5*7 我们可以变成 10(2*5)或 14(2*7) 或 35(5*7)或 2 或 5 或 7 或 1 这七种状态 当我们把他们(2,5,7)当作3个石子也就是一堆时,然而实际上我们是将这堆石子进行ni

6:知识的领域和结构,一种新的奇思妙想的组合结合

1.三个案例 案例1:幼儿的语言学习 可见现象: 1.听音学语言,只有声音--结果:学不会 2.听看学语言,声音和画面--结果:很容易学会 通过不断的倾听声音和观察的画面形成关联 案例2:PPT训练营 可见现象: 操作技巧很熟练,但是成品整体水平很差劲. 做好PPT的3个领域知识: 1.PPT操作技巧: 插入元素.母版.快捷键.动画 2.足够的审美知识: 空间结构.颜色搭配.元素设计 3.足够的逻辑能力 结构大纲.先后顺序.语言提炼 案例3:记忆数字 一样长度的数字,有些容易记忆有些却很难 20

HDU 4497 素数筛,合数分解

题意:给你两个数,G和L ,它们是一组数的GCD(最大公约数)和LCM(最小公倍数),求出满足条件的组合数,每个组合有三个数,排序不同,也算不同组合. L : p1^t1 * p2^t2 ... * pi^ti G: q1^s1 * q2^s2... * qi^si (pi和qii都是素数ii) G(最大公约数)里出现的所有数都要在L(最小公倍数)里出现,或者说L mod G=0,有人要问为什么了?其实仔细想想就清楚了,如果a,b,c的最小公倍数肯定可以被a,b,c任意一个整除,而他们的最大公约

Codeforces_776B: Sherlock and his girlfriend(素数筛)

题目链接 题意:对2~n+1染色,一个数不能与其素因子同色. 故而只需两种颜色即可,素数染1,合数染2便可满足条件 #include<bits/stdc++.h> using namespace std; typedef long long LL; //素数筛打表 const int N=1e5+10; int prime[N+5],num_prime=0; int isNotPrime[N+5]; void init() { isNotPrime[0]=isNotPrime[1]=1; fo

9种新思想

672. 2011年11月8日 - Lisp语言诞生的时候就包含了9种新思想.其中一些我们今天已经习以为常,另一些则刚刚在其他高级语言中出现,至今还有2种是Lisp独有的. [2016-05-01 15:35:48]673. (8) 代码使用符号和常量组成的树形表示法. [2016-05-01 15:36:21]674. (9) 无论什么时候,整个语言都是可用的. [2016-05-01 15:36:35]675. Lisp语言古怪倒不是因为它的语法很古怪,而是因为它根本没有语法,程序直接以解析

Codeforces Round #304 (Div. 2)——D素数筛+dp——Soldier and Number Game

Two soldiers are playing a game. At the beginning first of them chooses a positive integer n and gives it to the second soldier. Then the second one tries to make maximum possible number of rounds. Each round consists of choosing a positive integer x

数论线性筛总结 (素数筛,欧拉函数筛,莫比乌斯函数筛,前n个数的约数个数筛)

线性筛 线性筛在数论中起着至关重要的作用,可以大大降低求解一些问题的时间复杂度,使用线性筛有个前提(除了素数筛)所求函数必须是数论上定义的积性函数,即对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时f(ab)=f(a)f(b),在数论上就称它为积性函数,若a,b不互质也满足的话则称作完全积性函数,下面说明每个筛子是怎么筛的. 最基础的是素数筛,其它三个筛都是以素数筛为前提 素数筛 void get_prime() { int pnum = 0; for(int i = 2;

POJ 2635 The Embarrassed Cryptographer (同余线性方程+素数筛)

题目地址:POJ 2635 先用素数筛把10^6万以内素数筛出来.然后把输入的那个大数转化成数组,并且每三位存成一个数,这样可以节约内存和时间,然后利用同余线性的原理,对那个小整数以内的所有素数枚举,然后判断是否整除,找到最小的能被整除的. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #i