递归电话卡住

时间:2018-01-26 22:57:40

标签: c++ math recursion

 #include <bits/stdc++.h>
 using namespace std;
 int gcd(long long int a, long long int b){
      if(a||b==0){
           return 0;
      }
      else if(b==a){
           return a;
      }
      else if(a>b){
           return gcd(a-b,b);
      }
      else{
           return gcd(a,b-a);
      }
 }
 int lcm(long long int a,long long int b){
      return a*b/(gcd(a,b));
 }
 int main(){
      long long int answer=1;
      for (int i = 2; i<=20; i++) {
      answer=lcm(i,answer);
      cout<<answer;
      }
      cout<<answer;
      return 0;
 }

我在项目euler中为问题5编写了这段代码。但是输出屏幕什么都没有显示并且正在被绞死。我放了一些调试cout语句,我明白在主函数中它正在进入循环,但是在调用lcm之后它没有继续执行。

该程序是从1到20找到lcm的数字。我使用公式llcm = a * b / gcd(a,b)。在gcd中我也使用了递归欧几里德算法。我无法找出这个错误的原因。任何人都可以帮忙。

如果有关于我的编码风格(缩进,类型转换,变量名称,算法或任何东西)的任何建议,请指出。我是初学者所以我对c ++和编程风格知之甚少。

1 个答案:

答案 0 :(得分:4)

由于这条线,您的程序正在陷入困境:

if (a || b == 0) {

==运算符的优先级高于||,因此条件实际上与以下内容相同:

if (a || (b == 0)) {

在C(++)中与:

相同
if ((a != 0) || (b == 0)) {

也就是说,如果a为非零,则b为零。 a将立即为非零,因此您的程序将始终尝试除以零,这会导致问题。我不确定你在哪里找到这个版本的算法,粗略的搜索结果有一个更简单的变体:

int gcd(int a, int b) {
    if (b == 0) {
        return a;
    } else {
        return gcd(b, (a % b));
    }
}

至于你的问题的第二部分,你的代码中会有很多(风格)问题我会改变。间距不一致,不必要地使用long long intint会在这里做得很好)......但对于这些,我建议使用the codereview StackExchange

相关问题