I am a teacher!

导航

计算机等级考试二级C语言程序设计专项训练题——程序设计题(六)

41、编写函数void  fun (int a[], int b[],int *n),其功能是:找出数组a保存的100个四位数中的全部素数,将这些素数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排序,并通过形参n返回这些素数的个数。

#include <stdio.h>
#include <stdlib.h>
void  fun (int a[], int b[],int *n)
{
}
int main()
{
    int aa[100],bb[100], n, i ;
    for(i=0;i<100;i++)
       aa[i]=rand()%9000+1000;
    printf("The original Array is : \n");
    for ( i = 0 ; i < 100 ; i++ )
    {
        printf("%6d", aa[i]) ;
        if ((i + 1) % 10 == 0) printf("\n") ;
    }
    fun (aa,bb, &n) ;
    printf("The Result Array is : \n");
    for ( i = 0 ; i < n ; i++ )
    {
        printf("%6d", bb[i]) ;
        if ((i + 1) % 10 == 0) printf("\n") ;
    }
    return 0;
}
void  fun (int a[], int b[],int *n)
{
    int i,j,cnt=0,t;
    for (i=0;i<100;i++)
    {
        if (a[i]%2==0) continue;
        for (j=3;j<a[i];j+=2)
            if (a[i]%j==0) break;
        if (j>=a[i]) b[cnt++]=a[i];
    }
    for (i=0;i<cnt-1;i++)
       for(j=i+1;j<cnt;j++)
          if(b[i]>b[j])
          {  t=b[i]; b[i]=b[j]; b[j]=t;}
    *n=cnt;
}
参考程序

42、编写函数void  fun (int a[], int b[],int *n),其功能是:在数组a保存的100个四位数中,如果一个四位数各位上的数字均是奇数,则将该数存入数组b中,然后对所有存入数组b的满足要求的四位数按从小到大的顺序进行排序,通过形参n返回这些数的个数。

#include <stdio.h>
#include <stdlib.h>
void  fun (int a[], int b[],int *n)
{
}
int main()
{
    int aa[100],bb[100], n, i ;
    for(i=0;i<100;i++)
       aa[i]=rand()%9000+1000;
    printf("The original Array is : \n");
    for ( i = 0 ; i < 100 ; i++ )
    {
        printf("%6d", aa[i]) ;
        if ((i + 1) % 10 == 0) printf("\n") ;
    }
    fun (aa,bb, &n) ;
    printf("The Result Array is : \n");
    for ( i = 0 ; i < n ; i++ )
    {
        printf("%6d", bb[i]) ;
        if ((i + 1) % 10 == 0) printf("\n") ;
    }
    return 0;
}
void  fun (int a[], int b[],int *n)
{
    int i,j,cnt=0,t;
    for (i=0;i<100;i++)
    {
        int qw,bw,sw,gw;
        qw=a[i]/1000;
        bw=a[i]%1000/100;
        sw=a[i]%100/10;
        gw=a[i]%10;
        if (qw%2 && bw%2 && sw%2 &&gw%2)
           b[cnt++]=a[i];
    }
    for (i=0;i<cnt-1;i++)
       for(j=i+1;j<cnt;j++)
          if(b[i]>b[j])
          {  t=b[i]; b[i]=b[j]; b[j]=t;}
    *n=cnt;
}
参考程序

43、编写函数void  fun (int a[], int *n),其功能是:找出所有满足下列条件的四位自然数,并将这些四位自然数按从小到大的顺序存入数组a中,并通过形参n返回这些数的个数。条件是:千位数字与百位数字之和等于十位数字与个位数字之和,且千位数字与百位数字之和等于个位数字与千位数字之差的10倍。

#include <stdio.h>
#include <stdlib.h>
void  fun (int a[], int *n)
{
}
int main()
{
    int aa[9000],n, i ;
    fun (aa,&n) ;
    printf("The Result Array is : \n");
    for ( i = 0 ; i < n ; i++ )
    {
        printf("%6d", aa[i]) ;
        if ((i + 1) % 10 == 0) printf("\n") ;
    }
    return 0;
}
void  fun (int a[], int *n)
{
    int i,cnt=0,qw,bw,sw,gw;
    for (i=1000;i<10000;i++)
    {
        qw=i/1000;
        bw=i%1000/100;
        sw=i%100/10;
        gw=i%10;
        if (qw+bw==sw+gw && qw+bw==(gw-qw)*10)
           a[cnt++]=i;
    }
    *n=cnt;
}
参考程序

 44、自然数的平方数是:1  4  9  16  25 …

        自然数的立方数是:1  8  27  64  125 …

        自然数的4次方数是:1  16  81  256 …

        …

      这些数字都可以称为次方数。

      1~10000中,所有的次方数有125个,列举如下:

编写函数void  fun (int a[], int *n),其功能是:找出1~10000中所有的次方数,将这些次方数存入数组a中,并通过形参n返回这些数的个数。

#include <stdio.h>
#include <stdlib.h>
void  fun (int a[], int *n)
{
}
int main()
{
    int aa[10000],n, i ;
    fun (aa,&n) ;
    printf("The Result is : \n");
    for ( i = 0 ; i < n ; i++ )
    {
        printf("%6d", aa[i]) ;
        if ((i + 1) % 10 == 0) printf("\n") ;
    }
    return 0;
}
// 定义数组int h[10001],其中h[i]=0表示i不是次方数,h[i]!=0表示i是次方数。
// 初始时,置h[1]=1,h[4]=2,h[9]=3,h[16]=4,…,分别表示1、4、9、16是1、2、3、4的平方数,它们也是次方数
// 用循环依次对数组h进行扫描,当h[4]=2!=0时,4是次方数,保存4到数组a中,同时置h[8]=h[4]=2,表示8是2的3次方数,……
void  fun (int a[], int *n)
{
    int h[10001]={0},cnt=0;
    int i;
    for (i=1;i<=100;i++) //找出所有的二次方
    {
       h[i*i]=i;
    }
    for (i=1;i<=10000;i++)
    {
       if (h[i]!=0)  // i是次方数
       {
          if(i*h[i]<=10000) h[i*h[i]]=h[i]; // 算出对应数的下一个次方
          a[cnt++]=i;
       }
    }
    *n=cnt;
}
参考程序

45、给定一个整数数组a[0..n-1],a中连续的相等数组元素构成的子序列称为平台。

编写函数void  fun (int a[], int n,int *len,int *pos),其功能是:求具有n个元素的整型数组a中最长平台的长度len和其在a数组中的起始位置pos。

#include <stdio.h>
#include <stdlib.h>
void  fun (int a[], int n,int *len,int *pos)
{
}
int main()
{
    int aa[30],n, k,i ;
    for(i=0;i<30;i++)
       aa[i]=rand()%20;
    printf("The original Array is : \n");
    for ( i = 0 ; i < 30 ; i++ )
    {
        printf("%6d", aa[i]) ;
        if ((i + 1) % 10 == 0) printf("\n") ;
    }
    fun(aa,30,&n,&k);
    printf("最长平台长度 %d,在aa数组中起始下标为%d\n",n,k);
    return 0;
}
// 用l代表最长平台的长度(初始值为1),用k指示最长平台在数组a中的起始位置(下标)。
// 用j保存局部平台的起始位置,用i指示扫描a数组的下标,i从0开始,依次和后续元素比较,
// 若局部平台长度(i-j)大于l时,则修改最长平台的长度l=i-j+1 和其在a中的起始位置k=j,
// 直到a数组结束,l和k即为所求。
void  fun (int a[], int n,int *len,int *pos)
{
    int l=1,k=0,j=0,i=0;
    while(i<n-1)
    {
        while (i<n-1 && a[i]==a[i+1]) i++;
        if (i-j+1>l) {l=i-j+1;  k=j;}   // 局部最长平台
        i++; j=i;         //新平台起点
    }
    *len=l;
    *pos=k;
}
参考程序

posted on 2022-11-19 10:16  aTeacher  阅读(278)  评论(0编辑  收藏  举报