40026118素数的个数(C++)

#include<iostream>
#define LL long long
#define maxn 1000010
using namespace std;
LL read()
{
LL x=0,f=1;
char c=getchar();
while(!isdigit(c)){if(c==‘-‘)f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-‘0‘;c=getchar();}
return x*f;
}
bool prime[maxn];
LL a;
void prime_table()
{
for(int i=2;(LL)i<=a;i++) prime[i]=1;
for(int i=2;(LL)i*i<=a;i++)
if(prime[i]) for(LL j=i*i;j<=a;j+=i) prime[j]=0;
return;
}

int main()
{
a=read();
prime_table();
int cnt=0;
for(int i=2;i<=a;i++)if(prime[i]) cnt++;
printf("%d\n", cnt);
//system("pause");
return 0;
}

时间: 2024-08-28 11:10:04

40026118素数的个数(C++)的相关文章

埃氏筛选 - 素数的个数

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; const int maxn = 1000000 + 200; int prime[maxn]; //第i个素数 bool is_prime[maxn + 1]; //is_prime[i]位true, 表示i是素数 void solve(); int sieve

用算法求N(N&gt;=3)之内素数的个数

首先,我们谈一下素数的定义,什么是素数?除了1和它本身外,不能被其他自然数整除(除0以外)的数 称之为素数(质数):否则称为合数. 根据素数的定义,在解决这个问题上,一开始我想到的方法是从3到N之间每个奇数进行遍历,然后再按照素数的定义去逐个除以3到 根号N之间的奇数,就可以计算素数的个数了. 于是便编写了下面的代码: (代码是用C++编写的) #include<iostream> #include <time.h> using namespace std; #define N 1

区间内素数的个数

2016.1.26 试题描述 给定两个正整数 a 和 b,请你统计区间 [a,b) 内有多少个素数. 输入 共一行包含两个正整数 a 和 b,用一个空格分隔开. 输出 一个数,表示所给区间内的素数的个数. 输入示例 22 37 输出示例 3  其他说明 数据范围:1≤ a < b ≤ 10^12 , b-a ≤ 10^7 .样例说明:有23. 29 和 31 共 3 个素数. 区间筛嘛~随便筛~就是当年写的代码比较难看?_? #include<iostream> #include<

埃氏筛法(快速筛选n以内素数的个数)

给你一个数n,请问n以内有多少个素数?(n <= 10e7) 一般来说,要是对一个整数进行素数判断,首先想到的是写个函数判断是否为素数,然后调用这个函数,时间复杂度为O(n^(½)),但是要求n以内的素数就略显吃力了. 要是求n以内的素数个数的话,可以用埃式筛选.预处理一下. 先看下面的代码: 1 /* 2 |埃式筛法| 3 |快速筛选素数| |15-7-26| 4 */ 5 #include <iostream> 6 #include <cstdio> 7 using na

《挑战程序设计竞赛》 大区间内素数的个数

题意: 给一个区间边界值很大的区间,但是区间大小较小,求出该区间内所有质数个数. 知识补充: 因数枚举:分解一个数n,至于要从1 枚举到 n??√ 即可,然后把i和 n / i 当做因数加入vector 整数分解(把一个整数枚举出其质数基连乘的形式):从2开始枚举质数基,然后每次把该整数尽可能的被当前质数除去最大次数,这样该整数就会变小,极大减少枚举量.注意和map搭配使用,记录每一个质数的个数. 埃式素数筛法的复杂度是:Ologlogn看做线性也无妨. 求区间[a,b)内素数的个数,由于b的最

求小于10000的素数的个数 Exercise06_10

1 /** 2 * @author 冰樱梦 3 * 时间:2018年下半年 4 * 题目:求小于10000的素数的个数 5 * 6 */ 7 public class Exercise06_10 { 8 public static void main(String[] args){ 9 int sum=0; 10 for(int i=1;i<=1000;i++){ 11 if(isPrime(i))sum++; 12 } 13 System.out.println("1000以内素数的个数

G - Non-Prime Factors Kattis - nonprimefactors (筛1-n内的当前数中非素数的个数)

题目链接: G - Non-Prime Factors  Kattis - nonprimefactors 题目大意:给你一个数n,然后问你n的因子中非素数的个数. 具体思路:埃筛,把每一个数的因子直接算出来就好了. AC代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 2e6 + 100; 4 int vis[maxn]; 5 int sto[maxn]; 6 void init() 7 { 8 f

查找2-n之间素数的个数

题目描述 查找2-n之间素数的个数.n为用户输入值.素数:一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数.如2,3,5,7,11,13,17…. 输入 整数n 输出 2-n之间素数的个数 样例输入 Copy 14 样例输出 Copy [2-14] prime numbers: 6 提示 注意输出字符串的内容和格式 def prime(x): j=2 while j<x: if x % j==0: break j+=1 if j==x: return True else

HDOJ(HDU) 2521 反素数(因子个数~)

Problem Description 反素数就是满足对于任意i(0< i < x),都有g(i) < g(x),(g(x)是x的因子个数),则x为一个反素数.现在给你一个整数区间[a,b],请你求出该区间的x使g(x)最大. Input 第一行输入n,接下来n行测试数据 输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b]. Output 输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数. Sample Input 3 2 3