- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)