C语言程序设计专项训练题之 素数及应用.docx

上传人:b****5 文档编号:5706020 上传时间:2022-12-31 格式:DOCX 页数:13 大小:19.21KB
下载 相关 举报
C语言程序设计专项训练题之 素数及应用.docx_第1页
第1页 / 共13页
C语言程序设计专项训练题之 素数及应用.docx_第2页
第2页 / 共13页
C语言程序设计专项训练题之 素数及应用.docx_第3页
第3页 / 共13页
C语言程序设计专项训练题之 素数及应用.docx_第4页
第4页 / 共13页
C语言程序设计专项训练题之 素数及应用.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

C语言程序设计专项训练题之 素数及应用.docx

《C语言程序设计专项训练题之 素数及应用.docx》由会员分享,可在线阅读,更多相关《C语言程序设计专项训练题之 素数及应用.docx(13页珍藏版)》请在冰豆网上搜索。

C语言程序设计专项训练题之 素数及应用.docx

C语言程序设计专项训练题之素数及应用

计算机等级考试二级C语言程序设计

专项训练题——素数及应用

素数(primenumber)又称质数,有无限个。

一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,这样的数就是素数,也就是说一个素数除了1和它本身以外不再有其他的因数。

显然,最小的素数是2。

如何判断一个正整数m是否是素数呢?

要判断一个整数m是否是素数,只需把m被2~m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数。

但实际上,m不必被2~m-1之间的每一个整数去除,只需被2~

之间的每一个整数去除就可以了。

如果m不能被2~

间任一整数整除,m必定是素数。

这是因为如果m能被2~m-1之间任一整数整除,其两个因子必定有一个小于或等于

,另一个大于或等于

一.实例解析

例1编写一个函数intfun(intn),判断正整数n是否素数,若是返回“1”,否则,返回“0”;在主函数中,求出3~100之间的所有孪生素数。

所谓孪生素数是指它们的差是2的两个素数。

例如,5、7是孪生素数;11、13也是孪生素数,而13、17不是。

#include

#include

intfun(intn)

{

}

intmain()

{

inti;

for(i=3;i<100;i=i+2)

if(fun(i)&&fun(i+2))

printf("(%2d,%2d)",i,i+2);

printf("\n");

return0;

}

解析:

按素数的判断方法,如果m不能被2~

间任一整数整除,m必定是素数。

编写的fun函数如下:

intfun(intn)

{

inti;

for(i=2;i<=sqrt(n);i++)

if(n%i==0)break;

if(i>sqrt(n))

return1;

else

return0;

}

例2一般认为最小的素数是2,接着是3,5,...。

也就是说,“2”是第1个素数,“3”是第2个素数,依此类推。

编写函数fun,其功能是:

求第m个素数,并作为函数值返回。

例如,若m=20,则函数返回值为71。

#include

#include

intfun(intm)

{

}

intmain()

{

intm,t;

scanf("%d",&m);

t=fun(m);

printf("%d",t);

return0;

}

解析:

若m=1,则直接返回第1个素数2;否则,从3开始判断每个奇数是否是素数,若是素数,则计数,计数到m,则返回当前的素数(即第m个素数)。

编写的fun函数如下:

intfun(intm)

{

inti,n,cnt;

if(m==1)return2;

cnt=1;

for(n=3;;n+=2)

{

for(i=2;i<=sqrt(n);i++)

if(n%i==0)break;

if(i>sqrt(n))

{

cnt++;

if(cnt==m)break;

}

}

returnn;

}

二.程序填空题

1.给定程序中,函数fun的功能是:

统计所有小于等于n(n>2)的素数的个数,素数的个数作为函数值返回。

#include

intfun(intn)

{

inti,j,count=1;

printf("\nTheprimenumberbetween2to%d\n",n);

printf("%5d",2);

for(i=3;i<=n;i+=2)

{

/**********found**********/

for(___1___;j

/**********found**********/

if(___2___%j==0)

break;

/**********found**********/

if(___3___>=i)

{count++;printf(count%15?

"%5d":

"\n%5d",i);}

}

returncount;

}

intmain()

{

intn=20,r;

r=fun(n);

printf("\nThenumberofprimeis:

%d\n",r);

return0;

}

2.用筛选法可得到2~n(n<10000)之间的所有素数,方法是:

首先从素数2开始,将所有2的倍数的数从数表中删除(把数表中相应位置的值置为0);接着从数表中找到下一个非0数,并从数表中删除该数的所有倍数,以此类推,直到所找的下一个数等于n为止。

这样会得到一个序列:

2,3,5,7,11,13,17,19,23,…。

函数fun用筛选法找出所有小于等于n的素数,并统计素数的个数作为函数值返回。

#include

intfun(intn)

{

inta[10000],i,j,count=0;

for(i=2;i<=n;i++)a[i]=i;

i=2;

while(i

{

/**********found**********/

for(j=a[i]*2;j<=n;j+=___1___)

a[j]=0;

i++;

/**********found**********/

while(___2___==0)

i++;

}

printf("\nTheprimenumberbetween2to%d\n",n);

for(i=2;i<=n;i++)

/**********found**********/

if(a[i]!

=___3___)

{

count++;

printf(count%15?

"%5d":

"\n%5d",a[i]);

}

returncount;

}

intmain()

{

intn=20,r;

r=fun(n);

printf("\nThenumberofprimeis:

%d\n",r);

return0;

}

3.给定程序中,函数intfun(intn)的功能是判断正整数n是否素数,若是返回“1”,否则,返回“0”;在主函数中,求出和为n(设n为大于4的偶数)的两个素数的积的最大值。

例如,输入n的值为50,输出应为589。

说明:

和为50的两个素数有3和47(积为141)、7和43(积为301)、13和37(积为481)、19和31(积为589)。

#include

#include

intfun(intn)

{

inti;

for(i=2;i<=sqrt(n);i++)

if(n%i==0)break;

/**********found**********/

if(___1___)

return1;

else

return0;

}

intmain()

{

inti,n,p=0;

scanf("%d",&n);

for(i=3;i<=n/2;i=i+2)

/**********found**********/

if(fun(i)&&___2___)

{

/**********found**********/

if(___3___)p=i*(n-i);

}

printf("%d\n",p);

return0;

}

三.程序填空题参考答案

1.

(1)j=2

(2)i(3)j

2.

(1)a[i]

(2)a[i](3)0

3.

(1)i>sqrt(n)

(2)fun(n-i)(3)i*(n-i)>p

四.程序设计题

1.编写函数fun,其功能是:

找出一个大于形参m且紧随m的素数,并作为函数值返回。

例如,若m=20,则函数返回值为23。

#include

intfun(intm)

{

}

intmain()

{

intm,t;

scanf("%d",&m);

t=fun(m);

printf("%d",t);

return0;

}

2.编写函数fun,其功能是:

计算并返回high以内最大的10个素数之和。

若high以内的素数不足10个,则返回值为high以内所有的素数之和。

例如,若high的值为100,则函数返回值为732。

#include

intfun(inthigh)

{

}

intmain()

{

intn;

scanf("%d",&n);

printf("%d\n",fun(n));

return0;

}

3.编写函数fun,其功能是:

计算3到n之间(含3和n)所有素数的平方根之和。

例如,在主函数中给n输入100后,输出为:

sum=148.874270。

#include

#include

doublefun(intn)

{

}

intmain()

{

intn;

doublesum;

printf("\n\nInputn:

");

scanf("%d",&n);

sum=fun(n);

printf("\n\nsum=%f\n\n",sum);

return0;

}

4.编写函数fun,它的功能是:

将大于整数m且紧靠m的k个素数存入xx所指的数组中。

例如,若输入175,则应输出:

1923293137。

#include

voidfun(intm,intk,intxx[])

{

}

intmain()

{

intm,n,zz[1000];

printf("\nPleaseentertwointegers:

");

scanf("%d%d",&m,&n);

fun(m,n,zz);

for(m=0;m

printf("%d",zz[m]);

printf("\n");

return0;

}

5.编写函数fun,它的功能是:

求出小于或等于lim的所有素数并存放到数组aa中,函数返回求出素数的个数。

#include

#defineMAX100

intfun(intlim,intaa[MAX])

{

}

intmain()

{

intlimit,i,sum;

intaa[MAX];

printf("输入一个整数");

scanf("%d",&limit);

sum=fun(limit,aa);

for(i=0;i

{

if(i%10==0&&i!

=0)printf("\n");

printf("%5d",aa[i]);

}

return0;

}

6.编写函数fun,它的功能是:

将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k传回。

例如,若输入:

17,则应输出:

9和46891012141516。

#include

voidfun(intm,int*k,intxx[])

{

}

intmain()

{

intm,n,zz[100];

printf("\nPleaseenteranintegernumberbetween10and100:

");

scanf("%d",&n);

fun(n,&m,zz);

printf("\n\nThereare%dnon-primenumberslessthan%d:

",m,n);

for(n=0;n

printf("\n%4d",zz[n]);

return0;

}

五.程序设计题参考程序

1.intfun(intm)

{

inti,k;

for(i=m+1;;i++)

{

for(k=2;k

if(i%k==0)break;

if(k>=i)

returni;

}

}

2.intfun(inthigh)

{

intsum=0,n=0,j,yes;

while(high>=2&&n<10)

{

yes=1;

for(j=2;j<=high/2;j++)

if(high%j==0)

{

yes=0;break;

}

if(yes){sum+=high;n++;}

high--;

}

returnsum;

}

3.doublefun(intn)

{

doubles=0.0;

inti,k;

for(i=3;i<=n;i+=2)

{

for(k=3;k<=i/3;k+=2)

if(i%k==0)break;

if(k>i/3)

s+=sqrt(1.0*i);

}

returns;

}

4.voidfun(intm,intk,intxx[])

{

intx,i,n;

x=m+1;

n=0;

while(n

{

for(i=2;i<=x/2;i++)

if(x%i==0)break;

if(i>x/2)xx[n++]=x;

x++;

}

}

5.intfun(intlim,intaa[MAX])

{

inti,k,n;

if(lim<2)return0;

aa[0]=2;

n=1;

for(i=3;i<=lim;i++)

{

for(k=0;k

if(i%aa[k]==0)break;

if(k>=n)aa[n++]=i;

}

returnn;

}

6.voidfun(intm,int*k,intxx[])

{

inti,j=0,t;

for(i=4;i

{

for(t=2;t<=i/2;t++)

if(i%t==0)break;

if(t<=i/2)xx[j++]=i;

}

*k=j;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 商业计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1