这是我尝试计算两个输入数字的GCD:
int rep;
do{
system ("cls");
int a, b, gcd=2, e, d;
cin >> a >> b;
if(a % b != 0 || b % a != 0){
do{
gcd = gcd + 1;
d = a % gcd;
e = b % gcd;
} while(d==0 && e==0);
cout << gcd-1;
}else if(a == 1 || b == 1){
gcd=1;
cout << gcd;
}else if(a >= b){
gcd = a;
cout << gcd;
}else if(b >= a){
gcd = b;
cout << gcd;
}
cin >> rep;
} while(rep == 1);
如果输入8和24,它会给出2作为答案。有人能在我的代码中发现问题吗?
答案 0 :(得分:0)
问题是算法在第一次测试GCD失败时放弃了。在大多数情况下,找到最大意味着超越一些不起作用的值。在这种情况下,最多8个工作意味着超过3,5和7。
8%24 == 8.因此do
循环至少运行一次。 gcd
变为3且经过测试,但未均匀分配为8,因此while
条件的计算结果为false。然后3 - 1
(2)将流式传输到cout
。但是,这不是正确的GCD。
您可以修改算法以从2个输入中的较小者开始,向下工作直到成功(此处为8),然后失败(此处为7)。
答案 1 :(得分:0)
GCD算法的核心只有3行,其余用于防止愚蠢。
#include <stdio.h>
unsigned GCD(unsigned x, unsigned y) {
unsigned z;
if (x < y) {
z = x; // swap
x = y;
y = z;
}
if (y == 0)
return 0;
while (z = x % y) { // perform the GCD with implicit 0 test
x = y;
y = z;
}
return y;
}
int main(void)
{
printf("GCD of %u, %u = %u\n", 1, 0, GCD(1, 0)); // billed as C
printf("GCD of %u, %u = %u\n", 0, 1, GCD(0, 1));
printf("GCD of %u, %u = %u\n", 1, 1, GCD(1, 1));
printf("GCD of %u, %u = %u\n", 8, 24, GCD(8, 24));
return 0;
}
节目输出:
GCD of 1, 0 = 0
GCD of 0, 1 = 0
GCD of 1, 1 = 1
GCD of 8, 24 = 8