首页 > 解决方案 > 我的中位数计算器中的输出问题

问题描述

bool isEven(int num){
    if(num % 2 == 0){
        return true;
    }
    else {
        return false;
    }
}


int main() {
    int footballPlayer[] = {1,2,3,4};
    int lengthOfArray = sizeof(footballPlayer) / sizeof(footballPlayer[0]);
    int oddMedianFormula = lengthOfArray/2;
    int evenMedianFormula = lengthOfArray/2;
    if(isEven(lengthOfArray) == false) {
         cout << "The median is " << footballPlayer[oddMedianFormula] << endl;
    } else {
        if(isEven(footballPlayer[evenMedianFormula]) == true && isEven(footballPlayer[evenMedianFormula - 1] == true)) {
            cout << "The median is " << (footballPlayer[evenMedianFormula - 1] + footballPlayer[evenMedianFormula]) / 2 << endl;
        }
        else if(isEven(footballPlayer[evenMedianFormula]) == false && isEven(footballPlayer[evenMedianFormula - 1] == false)) {
            cout << "The median is " << (footballPlayer[evenMedianFormula - 1] + footballPlayer[evenMedianFormula]) / 2 << endl;
        }
        else {
            cout << "The median is " << ((footballPlayer[evenMedianFormula - 1] + footballPlayer[evenMedianFormula]) / 2) + 0.5 << endl;
        }
    }

    return 0;
}

输出 = 2;

当我清楚地在输出中添加了一半(0.5)时,为什么我的输出是一个整数?

标签: c++

解决方案


当您将一个整数除以另一个整数时,您只需获得数学值的下限(作为整数)。比如说:1 / 2 = (int) floor(0.5) = 0。这里的答案(它们是正确的)建议(显式)将整数值转换为浮点数据类型。但我想补充一点。

您只需在后面加一个点2,让编译器知道您正在执行浮点数的除法。double在这种情况下,分子将被隐式类型转换为。不要混淆 ->2.2.0. 这是您修改后的代码:

#include <iostream>
using namespace std;

bool isEven(int num) {
  if (num % 2 == 0) {
    return true;
  } else {
    return false;
  }
}

int main() {
  int footballPlayer[] = {1, 2, 3, 4};
  int lengthOfArray = sizeof(footballPlayer) / sizeof(footballPlayer[0]);
  int oddMedianFormula = lengthOfArray / 2;
  int evenMedianFormula = lengthOfArray / 2;
  if (isEven(lengthOfArray) == false) {
    cout << "The median is " << footballPlayer[oddMedianFormula] << endl;
  } else {
    if (isEven(footballPlayer[evenMedianFormula]) == true &&
        isEven(footballPlayer[evenMedianFormula - 1] == true)) {
      cout << "The median is "
           << (footballPlayer[evenMedianFormula - 1] +
               footballPlayer[evenMedianFormula]) /
                  2.
           << endl;
    } else if (isEven(footballPlayer[evenMedianFormula]) == false &&
               isEven(footballPlayer[evenMedianFormula - 1] == false)) {
      cout << "The median is "
           << (footballPlayer[evenMedianFormula - 1] +
               footballPlayer[evenMedianFormula]) /
                  2.
           << endl;
    } else {
      cout << "The median is "
           << ((footballPlayer[evenMedianFormula - 1] +
                footballPlayer[evenMedianFormula]) /
               2.) +
                  0.5
           << endl;
    }
  }

  return 0;
}

我不知道为什么,但你的代码对我来说显然过于复杂。我实际上怀疑你的逻辑是否正确。如果您只想找到中位数,那么我认为这么多代码就足够了:

#include <iostream>
#include <vector>

double findMedianSorted(const std::vector<int> &v) {
  auto n = v.size();
  return n % 2 ? v[n / 2] : (v[(n - 1) / 2] + v[n / 2]) / 2.;
}

int main() {
  std::vector<int> footballPlayer = {1, 2, 3, 4};
  std::cout << "Median is: " << findMedianSorted(footballPlayer);
}

推荐阅读