第7章数组题稿.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 数组 7.1用筛法求100之内的素数。 解:所谓“筛法”指的是“Eratosthenes筛法”。Eratosthenes是古希腊的著名数学家。他采用的方法是:在一张纸上写下1~1000之间的全部整数,然后逐个判断它们是否素数,找出一个非素数就把它挖掉,最后剩下的就是素数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 … 具体做法如下: 先将1挖掉(因为1不是素数)。 用2去除它后面的各个数,把能被2整除的数(如4,6,8…)挖掉,即把2的倍数挖掉。 用3去除它后面各数,把3的倍数挖掉。 分别用4,5…各数作为除数去除这些数以后的各数。这个过程一直进行到在除数后面的数已全被挖掉为止。例如在上表中1~50范围内的素数,要一直进行到除数为47为止。事实上,这一过程可以简化。如果需要找1~n范围内的素数,只需进行到除数为(取其整数)即可。例如对1~50,只需进行到将7(即的整数部分)作为除数即可。 上面的算法可表示为: 挖去1; 用刚才被挖去的数的下一个数p去除p后面的各数,把p的倍数挖掉; 检查p是否小于的整数部分(如果n=1000,则检查p31否),如果是,则返回(2)继续执行,否则就结束; 纸上剩下的就是素数。 解题的基本思路有了,但要变成计算机的操作,还要作进一步的分析。如怎样判断一个数是否已被“挖掉”,怎样找出某一个数p的倍数,怎样打印出未被挖掉的数。可以设一个数组a,a[1]到a[100]的值分别是1,2,3,…100。然后用上述方法将非素数“挖去”。如果一个数被认为是非素数,就将它的值变为零,最后将不为零的数组元素输出,就是所求的素数表。 程序如下: #include math.h main ( ) { int i,j,n,a[101]; for (i=1;i=100;i++) a[i] =i; for (i=2;isqrt(100);i++) for (j=i+1;j=100;j++) {if (a[i]!=0 a[j]!=0) if (a[j]%a[i]==0) a[j]=0; } /*非素数,赋值为0,“挖掉”*/ printf(“\n”); for (i=2,n=0;i=100;i++) { if (a[i]!=0) {printf(“%5d”,a[i]); n++; } if (n==10) /*此处if 语句的作用是在输出10个数后换行*/ { printf (“\n”); n=0; } } } 运行结果: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 7.2用选择法对10个整数排序(从小到大)。 解:选择排序的思路如下: 设有10个元素a[1]~a[10],将a[1]与a[2]~a[10]比较,若a[1]比a[2]~a[10]都小,则不进行交换,即无任何操作。若a[2]~a[10]中有一个以上比a[1]小,则将其中最小的一个(假设为a[i])与a[1]交换,此时a[1]中存放了10个中最小的数。第二轮将a[2]与a[3]~a[10]比较,将剩下9个数中的最小者a[i]与a[2]对换,此时a[2]中存放的是10个中第2小的数。依此类推,共进行9轮比较,a[1]到a[10]就已按由小到大的顺序存放。 程序如下: main ( ) { int i,j,min,a[11]; printf(“Enter data:\n”); for (i=1;i=10;i++) {printf(“a[%d]=”,i); scanf(“%d”,a[i]); /*输入10个数*/ } printf(“\n”); for (i=1;i=10;i++) pritnf(“%5d”,a[i]); /*输出这10个数*/ printf(“\n”); for (i=1;i=9;i++) /*以下8行是对10个数排序*/ {min=i; for (j=i+1;j=10;j++) if (a[min]a[j]) min=j; a[0]=a[i];

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

我是一名原创力文库的爱好者!从事自由职业!

1亿VIP精品文档

相关文档