计算机等级考试二级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; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 定义数组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; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 用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; }