题目描述:
data.txt内存有2048个整数,其中前n哥为非0数,后2048-n个数为0,将其读入数组,计算非零数的个数n。 选出n个数中的最大数&最小数。 选出n个数中最大素数。将n个数从大到小排序,并平均分成三段(若n非3的整数倍,则不考虑最后的1-2个数),选出中间段的最大数和最小数。
输入描述:
12 56 54 97 10 -12 123 634 123 -214 213 54 0 0 0 0 0 0 0 0 0 0 0(假设这些数是所给数)
输出描述:
非零数的个数为:12
12个数中最大的数为634,最小的数为-214
最大素数:97
中间段最大的数为97,最小的数为54
代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int seekNotZeroNum(int data[]);
int sort(int data[],int num);
int isPrime(int x);
int seekMaxPrime(int data[],int num);
int seekMidMaxAndMin(int data[],int num);
int main(){
FILE *fp;
int data[2048];
int i=0;
int nznum,maxprime;
if((fp=fopen("D:\\2019Post\\pat\\pat\\data2010.txt","r"))==NULL){
printf("can not open the file");
exit(0);
}
while(!feof(fp)){
fscanf(fp,"%d",&data[i]);
i++;
}
nznum=seekNotZeroNum(data);
printf("非零数的个数为:%d\n",nznum);
sort(data,nznum);
printf("%d个数中最大的数为%d,最小的数为%d\n",nznum,data[nznum-1],data[0]);
maxprime=seekMaxPrime(data,nznum);
printf("最大素数:%d\n",maxprime);
seekMidMaxAndMin(data,nznum);
printf("中间段最大的数为%d,最小的数为%d\n",data[nznum/3],data[nznum/3*2-1]);
}
int seekNotZeroNum(int data[]){
int i=0;
while(data[i]!=0){
i++;
}
return i;
}
int sort(int data[],int num){
int i,j,temp;
for(i=1;i<num;i++)
for(j=0;j<num-i;j++){
if(data[j]>data[j+1]){
temp=data[j];
data[j]=data[j+1];
data[j+1]=temp;
}
}
}
int isPrime(int x){
int i=0;
for(i=2;i<=sqrt((double)x);i++){
if(x%i==0){
return 0;
}
}
return 1;
}
int seekMaxPrime(int data[],int num){
int i=0,max=-1;
while(data[i]<=1){
i++;
}
for(;i<num;i++){
if(isPrime(data[i])){
if(data[i]>max){
max=data[i];
}
}
}
return max;
}
int seekMidMaxAndMin(int data[],int num){
int i,j,temp;
for(i=1;i<num;i++)
for(j=0;j<num-i;j++){
if(data[j]<data[j+1]){
temp=data[j];
data[j]=data[j+1];
data[j+1]=temp;
}
}
}