学霸大大请问这道题我这个程序哪错了。感激不尽
发布网友
发布时间:2024-06-26 11:51
我来回答
共1个回答
热心网友
时间:2024-06-26 11:58
我感觉你这个好像没有错吧...
因为没用过你这个高级的extern int,所以自己大概仿制你的打了一个...调了几组数据,发现你的选择排序打错了.
你可以耐心看一下我下面的注释
#include<cstdio>
void fun(int a[10],int n){
int i,j,t,k;
//选择排序,然后取有序数列的第2第9项
//其实可以只要一个for就能求次大次小...
for(i=0;i<10;i++){
for(int j=i+1;j<10;j++)
if(a[i]<a[j]){
//我感觉你这一段有问题...
//如果我们比较a[k]和a[j],k是上一次选择的位置,但是现在放的是上一次交换过后放着的a[i],所以比较这两个数,对于已经更改过后的a[i],是没有意义的,有一种简单的改法就是直接每次都和a[i]比较,选择一个最大的放着这里.
t=a[i],a[i]=a[j],a[j]=t;
}
}
printf("the max2 is:%d\n",a[1]);
printf("the min2 is:%d\n",a[8]);
}
int fac(int n,int m){
int temp,r;
if(n<m){
temp=n,n=m,m=temp;
}
while(m!=0){
r=n%m,n=m,m=r;
}
printf("the greatest divisor is:%d\n",n);//最大公约数就是最后剩下的n
//printf("the last multiple is:\n");不知道这句问最后的倍数是干嘛?...
}
int main(){
freopen("x.in","r",stdin);
int a[10],i,d,c;
printf("input numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("input two numbers:\n");
scanf("%d%d",&c,&d);
fac(c,d);
fun(a,10);
return 0;
}
/*
随便造了一组样例
样例A:
input numbers: 2 3 4 6 7 8 9 5 1 10
input two numbers: 1024 672
the greatest divisor is:32
the max2 is:2
the min2 is:9
感觉是正确的
样例B:
input numbers: 200 1 24 58 14 99 156 142 258 233
input two numbers: 123456 654321
the greatest divisor is:3
the max2 is:58
the min2 is:233
这个好像就跑挂了,上去发现你选择排序的一个问题,然后修改了一下
更改过后的程序跑样例B:
input numbers: 200 1 24 58 14 99 156 142 258 233
input two numbers: 123456 654321
the greatest divisor is:3
the max2 is:233
the min2 is:14
现在是正确的了
*/
然后注释里说有一种只用一个for的做法...
主要思路很简单,就是如果当前数比最大值大,那么次大值就是以前的最大值,最大值是当前数;如果比最大值小或等于,却比次大值大,就之修改次大值.
void fun(int a[10],int n){
int i;
int INF=0x3f3f3f3f;//定义一个很大的数
int max1=a[0],max2=-INF,min1=a[0],min2=INF;
//max1表示最大值,max2表示次大值,min1,min2同理
//先把最大最小初始化成a[0],其它两个初始化为无穷大和无穷小
for(i=1;i<10;i++){
if(a[i]>max1){ max2=max1,max1=a[i];}
else if(a[i]>max2){ max2=a[i]; }
if(a[i]<min1){ min2=min1,min1=a[i];}
else if(a[i]<min2){ min2=a[i]; }
}
printf("the max2 is:%d\n",max2);
printf("the min2 is:%d\n",min2);
}