-2

我正在尝试在 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 命令,它不会执行。

有人可以找到错误/解释输出吗?谢谢 :)

4

1 回答 1

0

你的代码对我来说似乎很糟糕。您不介意超出数组边界进行处理,这是产生随机结果的好方法:

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].

于 2014-02-14T08:49:33.510 回答