Неожиданный выход - Нахождение максимума и второго максимума
Я пытаюсь реализовать простой турнир на C.
#include <stdio.h>
int main(void) {
int tourn[100], n, i;
printf("Give n:");
scanf("%d", &n);
printf("\n n = %d \n", n);
for(i = n; i <= (2*n)-1; i++)
scanf("%d", &tourn[i]);
build(tourn, n);
printf("\n Max = %d \n",tourn[1]);
printf("\n Next Max = %d \n",nextmax(tourn, n));
}
void build(int tourn[], int n) {
int i;
for(i = 2*n-2; i > 1; i = i-2)
tourn[i/2] = max(tourn[i], tourn[i+1]);
}
int nextmax(int tourn[],int n) {
int i = 2;
int next;
next = min(tourn[2], tourn[3]);
while(i <= 2*n-1) {
if(tourn[i] > tourn[i+1]) {
next = max(tourn[i+1], next);
i = 2*i;
}
else {
next = max(tourn[i], next);
i = 2*(i+1);
}
}
return(next);
}
int max(int i,int j) {
if(i > j)
return i;
else
return j;
}
int min(int i,int j) {
if(i < j)
return i;
else
return j;
}
Выход для n = 5
и 1 2 3 4 5
Макс = 4195048
Следующий Макс = 32588
и этот результат меняется каждый раз на небольшое количество!
если я помещу тестовую команду printf перед функцией сборки, она не будет выполнена.
Может кто-нибудь найти ошибку / объяснить выход? Спасибо:)
1 ответ
Твой код кажется мне неработоспособным. вы не возражаете против адресации за пределами вашего массива, что является хорошим способом получения случайных результатов:
while(i <= 2*n-1){
if(tourn[i]>tourn[i+1]){
next = max(tourn[i+1],next);
i=2*i;
} else {
next = max(tourn[i],next);
i=2*(i+1);
}
}
Ваш (логический) массив имеет размер 2n
, если i
достигает "наивысшего" значения, вы тестируете tourn[i + 1]
, который tourn[2n]
,