1.求2~2000的所有素数.有足够的内存,要求尽量快
int findvalue[2000]={2};
static int findx=1;
bool adjust(int value)
{
if (value==2)
return true;
for (int i = 0;i < findx;i++)
{
if (value%findvalue[i]==0)
return false;
}
findvalue[findx++]=value;
return true;
}
void main(){
for(int i=2;i<100;i++)
adjust(i);
for (int i=0;i<findx;i++)
cout<<findvalue[i]<<endl;
system("pause");
}
埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,
是一种由埃及数学家埃拉托斯特尼所提出的一种简单检定素数的算法。
我们详细列出算法如下:
第一步,列出如下这样以2开头的序列:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
第二步,标出序列中的第一个素数,主序列变成:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
第三步,将剩下序列中,第二项开始每隔一项划掉(2的倍数,用红色标出。),主序列变成:
2 3 5 7 9 11 13 15 17 19 21 23 25
第四步,如果现在这个序列中最大数小于第一个素数的平方,那么剩下的序列中所有的数都是素数,否则返回第二步。
本例中,因为25大于2的平方,我们返回第二步:
剩下的序列中第一个素数是3,将主序列中3的倍数划出(红色),主序列变成:
3 5 7 11 13 15 17 19 23 25
我们得到的素数有:2,3。
25仍然大于3的平方,所以我们还要返回第二步:
现在序列中第一个素数是5,同样将序列中5的倍数划出,主序列成了:
5 7 11 13 15 17 19 23 25
我们得到的素数有:2 3 5 。
因为25等于5的平方,跳出循环.
结论:去掉红色的数字,2到25之间的素数是:2 3 5 7 11 13 17 19 23。
筛选的主要方法
1.划去2的倍数;
2.划去3的倍数;
3 划去5的倍数;(4的倍数同为2的倍数,已被划去)
4.划去7的倍数;(6的倍数同为3的倍数,已被划去)
5.划去11的倍数;(8和10的倍数同为2的倍数,而9的倍数也是3的倍数)
所以验证一个数是否是素数,可以用它来除以2,3,5,7,11。
百度百科。
2.A,B,C,D四个进程,A向buf里面写数据,B,C,D向buf里面读数据,
当A写完,且B,C,D都读一次后,A才能再写。用P,V操作实现。
semaphore empty = n
semaphore full;
semaphore mutex =1;
semaphore b = 1;
semaphore c = 1 ;
semaphore d = 1;
A (){
while(true){
p(empty);
p(b);
p(c);
p(d);
p(mutex);
write();
v(mutex);
v(full);
}
}
B (){
while(true){
p(full);
p(mutex);
write();
v(mutex);
v(empty);
v(b);
}
}
C(){
while(true){
p(full);
p(mutex);
write();
v(mutex);
v(empty);
v(c);
}
}
D (){
while(true){
p(full);
p(mutex);
write();
v(mutex);
v(empty);
v(d);
}
}
3.3.将二叉树的两个孩子换位置,即左变右,右变左。不能用递规