中位数求值(分治法)
输入两段相同长度的正序序列,求出合并后的中位数,例如:
//input.txt 2 5 15 3 21
//output.txt 5
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define MAX_SIZE 1000 4 int get_mid_num(int a[],int b[],int n); 5 // int fgetc(FILE *fp) 从文件中读一个字符 6 // int fputc(int c,FILE *fp) 向文件写入一个字符 7 // char * fgets(char *s,int size,FILE *fp); 从文件中读取若干个字符 8 // int fputs(const char*str,FILE *fp); 把str(可视为字符数组名)所指向的字符串,输出到fp所指的文件中 9 // int fscanf(FILE *fp,str "***%d***",a,b,c) 10 //fscanf 与 fputs 的区别:fscanf遇到换行和空格都要结束,而fputs仅仅遇到换行时结束 11 12 13 // 二进制方式 14 //unsigned fread(void *buf,unsigned size,unsigned count,FILE * fp) 数据块读取(输入)函数fread 15 //unsigned fwrite(const void *buf,unsignedsize,unsigned count ,FILE *fp) 将buf所指向内存中的count个数据块写入fp指向的文件中。每个数据块大小为size 16 int main() 17 { 18 FILE *fp; 19 fp=NULL; 20 fp=fopen("input.txt","r"); 21 if(fp==NULL) 22 { 23 printf("Failed to open file!\n"); 24 exit(0); 25 } 26 int a[MAX_SIZE]; 27 int b[MAX_SIZE]; 28 int n; 29 // printf("input n: "); 30 // scanf("%d",&n); 31 fscanf(fp,"%d",&n); 32 // printf("input a: "); 33 for(int i=0;i<n;i++) 34 { 35 // scanf("%d",a+i); 36 fscanf(fp,"%d",a+i); 37 } 38 // printf("input b: "); 39 for(int i=0;i<n;i++) 40 { 41 // scanf("%d",b+i); 42 fscanf(fp,"%d",b+i); 43 } 44 fclose(fp); 45 fp=fopen("output.txt","w"); 46 if(fp==NULL) 47 { 48 printf("Failed to open file!\n"); 49 exit(0); 50 } 51 // printf("%d",get_mid_num(a,b,n)); 52 fprintf(fp,"%d",get_mid_num(a,b,n)); 53 fclose(fp); 54 return 0; 55 } 56 57 get_mid_num(int a[],int b[],int n) 58 { 59 // printf("\n%d",n); 60 if(a[(n-1)/2]==b[(n-1)/2]) 61 { 62 // printf("!!!"); 63 return a[(n-1)/2]; 64 } 65 66 if(n==1) 67 { 68 // printf("n==1!"); 69 if(*a>*b) 70 return *b; 71 else 72 return *a; 73 } 74 else 75 { 76 if(a[(n-1)/2]>b[(n-1)/2]) 77 { 78 // printf("mid of a is %d\t",a[(n-1)/2]); 79 // printf("mid of b is %d\t",b[(n-1)/2]); 80 get_mid_num(&a[0],&b[n-(n+1)/2],(n+1)/2); 81 } 82 else 83 { 84 // printf("mid of a is %d\t",a[(n-1)/2]); 85 // printf("mid of b is %d\t",b[(n-1)/2]); 86 get_mid_num(&a[n-(n+1)/2],&b[0],(n+1)/2); 87 } 88 } 89 }