计算机等级考试二级C语言程序设计专项训练题——素数及应用
素数(prime number)又称质数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,这样的数就是素数,也就是说一个素数除了1和它本身以外不再有其他的因数。显然,最小的素数是2。
如何判断一个正整数m是否是素数呢?
要判断一个整数m是否是素数,只需把m被2~m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数。
但实际上,m不必被2~m-1之间的每一个整数去除,只需被2~sqrt(m) 之间的每一个整数去除就可以了。如果m不能被2~sqrt(m)间任一整数整除,m必定是素数。这是因为如果m能被2~m-1之间任一整数整除,其两个因子必定有一个小于或等于sqrt(m),另一个大于或等于sqrt(m)。
一.实例解析
例1 编写一个函数int fun(int n),判断正整数n是否素数,若是返回“1”,否则,返回“0”;在主函数中,求出3~100之间的所有孪生素数。所谓孪生素数是指它们的差是2的两个素数。例如,5、7是孪生素数;11、13也是孪生素数,而13、17不是。
#include <stdio.h>
#include <math.h>
int fun(int n)
{
}
int main()
{
int i;
for (i=3;i<100;i=i+2)
if (fun(i) && fun(i+2))
printf("(%2d , %2d) ",i,i+2);
printf("\n");
return 0;
}
解析:按素数的判断方法,如果m不能被2~sqrt(m)间任一整数整除,m必定是素数。
编写的fun函数如下:
int fun(int n)
{
int i;
for (i=2;i<=sqrt(n);i++)
if (n%i==0) break;
if (i>sqrt(n))
return 1;
else
return 0;
}
例2 一般认为最小的素数是2,接着是3,5,...。也就是说,“2”是第1个素数,“3”是第2个素数,依此类推。
编写函数fun,其功能是:求第m个素数,并作为函数值返回。
例如,若m=20,则函数返回值为71。
#include <stdio.h>
#include <math.h>
int fun(int m)
{
}
int main()
{
int m,t;
scanf("%d",&m);
t=fun(m);
printf("%d",t);
return 0;
}
解析:若m=1,则直接返回第1个素数2;否则,从3开始判断每个奇数是否是素数,若是素数,则计数,计数到m,则返回当前的素数(即第m个素数)。
编写的fun函数如下:
int fun(int m)
{
int i,n,cnt;
if (m==1) return 2;
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;
}
}
return n;
}
二.程序填空题
1.给定程序中,函数fun的功能是:统计所有小于等于n(n>2)的素数的个数,素数的个数作为函数值返回。
#include <stdio.h>
int fun(int n)
{
int i,j, count=1;
printf("\nThe prime number between 2 to %d\n", n);
printf("%5d",2);
for (i=3; i<=n; i+=2)
{
/**********found**********/
for (___1___; j<i; j++)
/**********found**********/
if (___2___%j == 0)
break;
/**********found**********/
if (___3___>=i)
{ count++; printf( count%15? "%5d":"\n%5d",i);}
}
return count;
}
int main()
{
int n=20, r;
r = fun(n);
printf("\nThe number of prime is : %d\n", r);
return 0;
}
2.用筛选法可得到2~n(n<10000)之间的所有素数,方法是:首先从素数2开始,将所有2的倍数的数从数表中删除(把数表中相应位置的值置为0);接着从数表中找到下一个非0数,并从数表中删除该数的所有倍数,以此类推,直到所找的下一个数等于n为止。这样会得到一个序列:2,3,5,7,11,13,17,19,23,…。
函数fun用筛选法找出所有小于等于n的素数,并统计素数的个数作为函数值返回。
#include <stdio.h>
int fun(int n)
{
int a[10000], i,j, count=0;
for (i=2; i<=n; i++) a[i] = i;
i = 2;
while (i<n)
{
/**********found**********/
for (j=a[i]*2; j<=n; j+=___1___)
a[j] = 0;
i++;
/**********found**********/
while (___2___==0)
i++;
}
printf("\nThe prime number between 2 to %d\n", n);
for (i=2; i<=n; i++)
/**********found**********/
if (a[i]!=___3___)
{
count++;
printf( count%15?"%5d":"\n%5d",a[i]);
}
return count;
}
int main()
{
int n=20, r;
r = fun(n);
printf("\nThe number of prime is : %d\n", r);
return 0;
}
3.给定程序中,函数int fun(int n)的功能是判断正整数n是否素数,若是返回“1”,否则,返回“0”;在主函数中,求出和为n(设n为大于4的偶数)的两个素数的积的最大值。
例如,输入n的值为50,输出应为589。说明:和为50的两个素数有3和47(积为141)、7和43(积为301)、13和37(积为481)、19和31(积为589)。
#include <stdio.h>
#include <math.h>
int fun(int n)
{
int i;
for (i=2;i<=sqrt(n);i++)
if (n%i==0) break;
/**********found**********/
if (___1___)
return 1;
else
return 0;
}
int main()
{
int i,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);
return 0;
}
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 <stdio.h>
int fun(int m)
{
}
int main()
{
int m,t;
scanf("%d",&m);
t=fun(m);
printf("%d",t);
return 0;
}
2.编写函数fun,其功能是:计算并返回high以内最大的10个素数之和。若high以内的素数不足10个,则返回值为high以内所有的素数之和。
例如,若high的值为100,则函数返回值为732。
#include <stdio.h>
int fun(int high)
{
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n", fun(n));
return 0;
}
3.编写函数fun,其功能是:计算3到n之间(含3和n)所有素数的平方根之和。
例如,在主函数中给n输入100后,输出为:sum=148.874270。
#include <stdio.h>
#include <math.h>
double fun(int n)
{
}
int main()
{
int n;
double sum;
printf("\n\nInput n: ");
scanf("%d",&n);
sum=fun(n);
printf("\n\nsum=%f\n\n",sum);
return 0;
}
4.编写函数fun,它的功能是:将大于整数m且紧靠m的k个素数存入xx所指的数组中。
例如,若输入17 5,则应输出:19 23 29 31 37。
#include <stdio.h>
void fun(int m,int k,int xx[])
{
}
int main()
{
int m,n,zz[1000];
printf("\nPlease enter two integers:");
scanf("%d%d",&m,&n);
fun(m,n,zz);
for(m=0;m<n;m++)
printf("%d ",zz[m]);
printf("\n");
return 0;
}
5.编写函数fun,它的功能是:求出小于或等于lim的所有素数并存放到数组aa中,函数返回求出素数的个数。
#include <stdio.h>
#define MAX 100
int fun(int lim, int aa[MAX])
{
}
int main()
{
int limit, i, sum;
int aa[MAX];
printf("输入一个整数");
scanf("%d", &limit);
sum=fun(limit, aa);
for(i=0 ; i < sum ; i++)
{
if(i % 10 == 0 && i != 0) printf("\n") ;
printf("%5d", aa[i]) ;
}
return 0;
}
6.编写函数fun,它的功能是:将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k传回。
例如,若输入:17,则应输出:9和4 6 8 9 10 12 14 15 16。
#include <stdio.h>
void fun( int m, int *k, int xx[] )
{
}
int main()
{
int m, n, zz[100];
printf("\nPlease enter an integer number between 10 and 100:");
scanf("%d", &n );
fun(n, &m, zz );
printf( "\n\nThere are %d non-prime numbers less than %d:", m, n );
for( n = 0; n < m; n++ )
printf( "\n %4d", zz[n] );
return 0;
}
1. int fun(int m) { int i, k ; for (i=m+1; ; i++) { for (k = 2 ; k < i ; k++) if (i % k == 0) break ; if (k >= i) return i; } } 2. int fun(int high) { int sum=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--; } return sum ; } 3. double fun(int n) { double s=0.0; int i,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); } return s; } 4. void fun(int m,int k,int xx[]) { int x,i,n; x=m+1; n=0; while (n<k) { for (i=2;i<=x/2;i++) if (x%i==0) break; if (i>x/2) xx[n++]=x; x++; } } 5. int fun(int lim, int aa[MAX]) { int i,k,n; if (lim<2) return 0; aa[0]=2; n=1; for (i=3;i<=lim;i++) { for (k=0;k<n;k++) if (i%aa[k]==0) break; if (k>=n) aa[n++]=i; } return n; } 6. void fun( int m, int *k, int xx[] ) { int i,j=0,t; for (i=4;i<m;i++) { for (t=2;t<=i/2;t++) if (i%t==0) break; if (t<=i/2) xx[j++]=i; } *k=j; }