导航
  • 主页
  • VC/MVC基础类
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC/MFC&Web
  • MFC Plus
  • VC++技术资源

这道程序什么意思啊!救命!!!

youwanna 2002-07-29 01:08:47
小弟因为想过高程,所以暑假一直在复习,遇到一道程序,百思不得其解,希望各位高手可以帮帮我,写个注释!!!求求你了!!!


本程序采用筛选法求质数,程序用一个无符号整数数组代表筛,它的每一位对应一个整数。因除2以外,其余所有的质数都是奇数。约定数组按位的顺序,集资对应整数,5,7,9,11…
程序首先将数组所能容纳的上述奇数放入筛中,即将数组的全部位都置成1。
从筛中找出最小的数,该数即为质数,然后将该质数的倍数从筛中去掉,即将在数组中与
它们对应的位置成0。因偶数不在筛中,去掉的数是找到的质数的1倍,3倍,5倍,…整数。反复上述过程,直至筛为空。程序就能求得指定范围内的全部质数。



#include <stdio.h>
#define N 50
#define LN 16
main()
{
unsigned int sieve[N],prime[N];
unsigned int j,w,p,c;
for (j=0; j<N; j++)
{ sieve[j]=0xFFFFFFFF;
prime[j]=0x00;
}
w=0;
j=0;
do
{ while (((0x01 << (j++)) & sieve[w])==0x00);
p=w*LN + j-1;
c=2*(p+1)+1;
prime[w] |= (0x01 << (j-1));
do
{ sieve[p/LN] &= (~(0x01 << p%LN));
w++;
j=0;
}while (p < N*LN-LN);
while ((sieve(w] == 0x00) && (w < N-1))
{ w++;
j=0;
}
}while (sieve[w]);
printf("%5d",2);
for (w=0; w<N; w++)
{ for (j=0; j<LN; j++)
{ if((0x01<<j) & prime[w])
printf("%5d", 2*(w*LN+j+1)+1);
}
printf("\n");
}





...全文
5 点赞 收藏 4
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
youwanna 2002-07-30
大家帮帮忙啊!!!!
回复
youwanna 2002-07-29
今天找到了解析:如下,不过我还是不懂!

  阅读程序说明和程序后可知,本程序采用筛选 法求质数,筛用无符号整数数组表示,每一位无符号整数中的1位二进制表示一个对应的整数,并且筛中只放奇数,筛选出的质数用prime表示,该二进制位为1表示对应的奇数是质数,为0表示对应的奇数是合数。主函数main一开始将筛sieve的每个元素各位置1,表示把奇数3,5,7,……放入筛中,同时将prime数组的每个元素各位置0,表示初始的质数表为空。
  根据程序可知,变量p表示筛中的第p们,变量C表示该位对应的整数。由于筛中存放的奇数是从3开始,因此c=2*(p+1)(p从0开始计数).数组元素sieve[w]的第K位表示筛中的p=w*16+k位,代表自然数c=2*(w*16+k+1)+1=2*(p+1)+1.
  程序中第一个while语句是在筛中找非零位,因为控制条件中含有j++,所以该非零位是j-1位,它对应筛中的w*16+j-1位。
  找到质数C后,将质数表中对应数C的位置为1。由于此位置应与筛中的位置相同,即为质数表中的第P位,而质数表原来此位为0,使用了|=运算。
  第二个do-while是从筛中删除质数C的倍数,即将筛中相应位置0。因公里数不在筛中,故C的倍数在质数表中的位置为p+nc。要将筛中的第P位置成0,即将w=p/LN字的k=p%LN位置成0。程序采用&=来实现将该位置为0。
  函数的最后部分是输出质数表,即将prime中的啡零位转换为整数。而w字j为转换成整数的公式为(w*LN+j+1)*2+1。
  
这道题似乎是1992年的程序员试题,我还想考高程,程序员的试题都不会做,唉!!
回复
howtotell 2002-07-29
faint!
回复
liuns 2002-07-29
死人了,读不给注释的程序,还不如去看之乎者也.一个循环结一个分析太困难了.我建议你把写这个程序的人找到PK一顿.
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……