素数表

#include<stdio.h>
#include<math.h>
#include<string.h>
int prime[1000010];
int vis[1000010];
int flag;
void init_prime()
{
    int i, j;
    for(i = 2;i <= sqrt(1000010); ++i)
    {
        if(!prime[i])
            for(j = i * i; j <= 1000010; j += i)
                prime[j] = 1;
    }
    j = 0;
    for(i = 2;i <= 1000010; ++i)
        if(!prime[i])
            prime[j++] = i;
        flag=j;
}
void vist_prime()
{
    int i;
    memset(vis,0,sizeof(vis));
    for(i=0;i<=flag-1;i++)
    {
        vis[prime[i]]=1;
    }
} 
时间: 2024-11-04 20:42:03

素数表的相关文章

POJ 1007 Difference Between Primes(线性筛法求N以内的素数表)

Difference Between Primes Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description All you know Goldbach conjecture.That is to say, Every even integer greater than 2 can be expressed as the sum of two primes. Today, sk

利用筛法求素数表

const int Max = 1e6 + 50; int isPrime[Max];<span style="white-space:pre"> </span>//素数判断结果表 int tblPrime[Max];<span style="white-space:pre"> </span>//所求得的素数表 int lenPrimes;<span style="white-space:pre&quo

筛选法&lt;求素数表&gt;

如果题目的数据规模较大,常规地逐个判断素数的方法行不通,可以使用筛选法进行预处理,将所有素数一次性求出并存入数组中. 筛选法求素数的主要思想如下: (1)将1~N的所有数都标记为素数,0表示素数,1表示非素数. (2)1不是素数,也不是合数,标记为1. (3)2是素数,保留.但比2大的所有2的倍数都标记为1,直到大于N为止. (4)继续寻找素数标记,找到3,将其保留,但比3大的所有3的倍数都标记为,直到大于N为止. -- tip:如果数组声明为全局变量,那么数组会初始化为全0,所以我没有定义in

厄拉多塞筛法和普通方法求素数表(python实现)

厄拉多筛法: 想要得到一个不大于N的数所有素数,可以先找到不超过根号N的所有素数,设2 = p1 < p2 < ......<pk ≤√N,然后在2,3,4......N里面进行下面的操作: 留下p1 = 2,把p1的倍数全部划掉, 再留下p2 ,把p2 的倍数全部划掉, 继续这一过程,直到留下pk,把pk的倍数全部划掉, 最后留下来就是不超过N的全体素数. 举例: N = 30   ,则取pk 为5,所以2到5的所有素数为2,3,5 第一遍 留下2,划去2的所有倍数 2   3    

Eratosthenes筛选法构造1-n 素数表

筛选法:对于不超过n的每个非负整数p,删除2p,3p,4p...当处理完所有数之后,还没没删除的就是素数. 代码中进行了相应的优化. 1 #include<bits/stdc++.h> 2 using namespace std; 3 int vis[10000]; 4 int main() 5 { 6 int n; 7 while(scanf("%d",&n)) 8 { 9 //-------------- 10 int m=sqrt(n+0.5); 11 mem

HDU 1973 Prime path(BFS+素数表)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1973 题目大意:给定两个四位素数a  b,要求把a变换到b变换的过程要保证  每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与前一步得到的素数  只能有一个位不同,而且每步得到的素数都不能重复.求从a到b最少需要的变换次数.无法变换则输出Impossible. 如下面的样例:1033 8179 1033 1733 3733 3739 3779 8779 8179 所以答案为6.

打印素数表

原理:对于每个不超过N的非负整数p,删除2*p,3*p,4*p,...,当处理完所有数之后,没有被删除的数就是素数 int vis[1001];void isprime(){    for(int i=2;i*i<=m;i++)//假设p=i:    {        if(!vis[i])//p不在之前的倍数行列        {            for(int j=i*i;j<=1000;j+=i)//将i*p,(i+1)*p,(i+2)*p,(i+3)*p,...删除      

P2158 [SDOI2008]仪仗队 线性筛(欧拉函数和素数表)

上三角行恰好是[1,n-1]的欧拉函数 http://www.luogu.org/problem/show?pid=2158#sub 1 //#pragma comment(linker, "/STACK:167772160") 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <iostream> 6 #include <queue&g

[Swust OJ 217]--Factor(数论,类素数表)

题目链接:http://acm.swust.edu.cn/problem/0217/ Time limit(ms): 2000 Memory limit(kb): 65535 Description 给定一个数,如N=10,我们知道它有如下4个因子:1.2.5.10.现在的问题来了:给你一个区间[A,B],通过编程求出该区间内具有最多因子的那个数,如果有多个具有最多因子的数,输出最小的那个数. Input 首先输入一个数cas,代表下面共有cas组测试数据.(cas< =20) 对于每组数据输入

UVA11752-The Super Powers(素数表+log)

题目链接 题意:如果有一个数至少是两个不同的正整数的幂,那么称它为超级幂.按照升序输出1~2^64-1之间的所有超级幂. 思路:n = a ^ i = b ^ j,那么就证明指数要为合数,所以只要找出64以内的所以合数,然后枚举在1 << 16之内的数为底数的值,这里要注意溢出问题,要求出每个底数a的所能得到的最大幂,所以max = (log(2 ^ 64 -1) / log(a)): 代码; #include <iostream> #include <cstdio>