C语言程序设计专项训练题之 素数及应用.docx
《C语言程序设计专项训练题之 素数及应用.docx》由会员分享,可在线阅读,更多相关《C语言程序设计专项训练题之 素数及应用.docx(13页珍藏版)》请在冰豆网上搜索。
![C语言程序设计专项训练题之 素数及应用.docx](https://file1.bdocx.com/fileroot1/2022-12/30/d7755f6f-183a-45d8-96a1-cedd5fdc9ba7/d7755f6f-183a-45d8-96a1-cedd5fdc9ba71.gif)
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;mprintf("%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;nprintf("\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;kif(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;
}