【问题标题】:Reference variable assignment logic引用变量赋值逻辑
【发布时间】:2020-11-10 01:07:36
【问题描述】:

好的,所以我正在创建一个函数,通过计算最大公因数来减少有理数,然后在减少/简化后返回新的分子和分母。例如:24/60 到 2/5。

void reduce(int &num, int &den){
  int remainder = num % den;

  while(remainder!=0){
    num = den;
    den = remainder;
    remainder = num % den;
    cout << "gcf: " << remainder << endl;
    break;
  }
    num = num / remainder;
    den = den / remainder;
  
}

该函数应返回 num = 2 和 den = 5。但是,由于某种原因,它返回 num = 5 和 den = 2。

我的主要功能是这样的

int main() {
    int num = 24;
    int den = 60;
    reduce(num, den);
    cout << num << " " << den;
    // Output: 
    // gcf: 12
    // 5 2

【问题讨论】:

  • 为什么不使用std::gcd
  • 循环中没有保护的break 语句会在循环中花费很短的时间。
  • @eerorika 我可以,但理论上我该怎么做(我做错了什么)

标签: c++ pass-by-reference


【解决方案1】:

您正在 while 循环内更改 numden。该值不应更改。

请将numden 变量存储在其他变量中,并使用这些值进行如下操作。

void reduce(int &num, int &den){
  int remainder = num % den;

  int tempNum = num, tempDen = den;
  while(remainder != 0){
    tempNum = tempDen;
    tempDen = remainder;
    remainder = tempNum % tempDen;
    cout << "gcf: " << remainder << endl;
    break;
  }
  num = num / remainder;
  den = den / remainder;
}

int main() {
    int num =24;
    int den = 60;
    reduce(num,den);
    cout << num << " " << den;
    return 0;
}

【讨论】:

  • 您甚至可以将循环提取到它自己的函数 gcd 中(如果可用 (C++17) 并允许,您可以将其替换为 std::gcd)。
猜你喜欢
  • 2020-03-24
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2014-01-10
  • 2016-12-18
  • 1970-01-01
相关资源
最近更新 更多