哈希和素数打表

输入一个数判断数组中是否存在这个数

输入一个数判断数组中是否存在这个数

举例子吧
一个数组a[7]={1,5,7,2,13,9,8}
然后再定义一个a数组中最大元素+1的数组b[14]={0};
for(i=0;i<7;i++)
b[a[i]]=1;
如果输了一个数w,则需要判断b[w]是不是为1,如果是1,a数组里有这个数

输入一个数判断数组中是否存在这个数并输出这个数在数组中的下标

举例子吧
一个数组a[7]={1,5,7,2,13,9,8}
然后再定义一个a数组中最大元素+1的数组b[14];
for(i=0;i<14;i++)
b[i]=-1;//将b数组都初始化为-1
for(i=0;i<7;i++)
b[a[i]]=i;
如果输了一个数w,则需要判断b[w]是不是-1,如果是-1,a数组里没有这个数
如果b[w]不是-1,a数组里就有这个数w,b[w]就是这个数w在a数组中的下标

素数打表

素数打表,思路就是下面这个图
素数打表
先从2开始(1不是素数忽略)
把2标记为素数,然后把2的倍数都标记为非素数
然后读2下一个素数3,把3标为素数,把3的倍数标为非素数
读到4,非素数,不处理,再读5
把5标记为素数,把5的倍数标记为非素数
读6,非素数,读7,素数,把7的倍数标记为非素数
(这时候已经把2,3,5,7的倍数标记为非素数了,标记了一大半了)
以此类推
下面上代码:

#include <stdio.h>
#define N 1000000
int main()
{
    long long int a[N]= {0},x,y,i,j,k;//数组a初始化为0
    for(i=2; i<N; i++)
        if(!a[i])//a[i]==0就说明i是素数
            for(j=i*i; j<N; j+=i)
                a[j]=1;//将i的倍数标记为1;
    for(i=2; i<N; i++)
        if(a[i]==0)
           printf("%lld
",i);//输出素数
    return 0;
}

还有一种:

#include <stdio.h>
#define N 1000000
int main()
{
    long long int a[N]= {0},x,y,i,j,k;//数组a初始化为0
    for(i=2; i<N; i++)
        if(!a[i])//a[i]==0就说明i是素数
            for(j=i+i; j<N; j+=i)
                a[j]=1;//将i的倍数标记为1;
    for(i=2; i<N; i++)
        if(a[i]==0)
           printf("%lld
",i);//输出素数
    return 0;
}

上面两个代码的区别:

for(j=i*i; j<N; j+=i)
	a[j]=1;//将i的倍数标记为1;
/**********************/
for(j=i+i; j<N; j+=i)
	a[j]=1;//将i的倍数标记为1;

第二个代码,i+i会出现这种问题:
比如6,10
6在读2的时候标记了非素数
6又在读3的时候标记了非素数
重复标记了两次
同样10也被重复标记了两次,分别是2和5的时候
而第一个代码,i*i就不会出现这种情况

原文地址:https://www.cnblogs.com/yanhua-tj/p/13996589.html