C语言程序设计教程(第三版)课后习题10.3
1352: C语言程序设计教程(第三版)课后习题10.3
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 813 Solved: 274
[Submit][Status][BBS]
Description
输入10个整数,把最大的数与最后一个数对换。写三个函数;再将其中最小的数与第一个数对换, ①输入10个数;②进行处理;③输出10个数。
Input
10个整数
Output
整理后的十个数,每个数后跟一个空格(注意最后一个数后也有空格)
Sample Input
2 1 3 4 5 6 7 8 10 9
Sample Output
1 2 3 4 5 6 7 8 9 10
错误的代码:
#include <stdio.h> const int N=1<<29; int a[15],min1=N,max1=-N,b,k; void make() { for(int i=0;i<10;i++) { if(a[i]>max1) { k=i; max1=a[i]; } if(a[i]<min1) { b=i; min1=a[i]; } } int temp; temp=a[b]; a[b]=a[0]; a[0]=temp; temp=a[k]; a[k]=a[9]; a[9]=temp; } void print() { int i; for(i=0;i<10;i++) { printf("%d ",a[i]); } printf("\n"); } int main() { while(scanf("%d",&a[0])!=EOF) { min1=N;max1=-N; for(int i=1;i<10;i++) { scanf("%d",&a[i]); } make(); print(); } }
刚刚开始这样交,怎么改都是错的,然后去请教大神,才知道正确的应该是这样
#include <stdio.h> const int N=1<<29; int a[15],min1,max1,b,k; void make() { for(int i=0; i<10; i++) { if(a[i]<min1) { b=i; min1=a[i]; } } int temp; temp=a[b]; a[b]=a[0]; a[0]=temp; for(int i=0; i<10; i++) { if(a[i]>max1) { k=i; max1=a[i]; } } temp=a[k]; a[k]=a[9]; a[9]=temp; } void print() { int i; for(i=0; i<10; i++) { printf("%d ",a[i]); } printf("\n"); } int main() { scanf("%d",&a[0]); { min1=N; max1=-N; for(int i=1; i<10; i++) { scanf("%d",&a[i]); } make(); print(); } }
因为:
比如测试数据是 :10 9 8 7 6 5 4 3 2 1时
第一组代码会这样:
最小值1先和第1个值10换
最大值10再和最后1个值1换
相当于换了两次
最终还是10 9 8 7 6 5 4 3 2 1
第二组代码会这样:
最小值1先和第1个值10换
然后最大值10和最后一个值10换
这时10本来就是最后一个值,相当于自己和自己换了一次
所以结果是:1 9 8 7 6 5 4 3 2 10