#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 ++和编程风格知之甚少。
答案 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 int
(int
会在这里做得很好)......但对于这些,我建议使用the codereview StackExchange。