I am a teacher!

导航

计算机等级考试二级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=22)i   (3)j
2.(1)a[i]   (2)a[i]   (30
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;

}

1int 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;
    }
}
2int 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 ;
}
3double 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;
}
4void 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++;
    }
}
5int 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;
}
6void 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;
}
程序设计题参考程序

posted on 2022-11-13 17:34  aTeacher  阅读(756)  评论(0编辑  收藏  举报