#include <stdio.h>int main(){ int hcf(int x, int y); int lcd(int x, int y); int a, b, c, d; printf("请输入两个数:"); scanf_s("%d%d", &a, &b); c = hcf(a, b); d = lcd(a, b); printf("最大公约数:%d\n最小公倍数:%d\n", c, d); return 0;}int hcf(int x, int y){ int i, z; if (x < y) { i = x; x = y; y = i; } z = x % y; while (z) { x = y; y = z; } return (z);}int lcd(int x, int y){ int i, z, m, n; m = x * y; if (x < y) { i = x; x = y; y = i; } z = x % y; while (z) { x = y; y = z; } n = m / z; return (n);}
看走眼了,while循环出不来,z的值一直没有变化,要更新z的值,最后return的是y的值,辗转相除法
#include <stdio.h>
int main() {
int hcf(int x, int y);
int lcd(int x, int y);
int a, b, c, d;
printf("请输入两个数:");
scanf("%d%d", &a, &b);
c = hcf(a, b);
d = lcd(a, b);
printf("最大公约数:%d\n最小公倍数:%d\n", c, d);
return 0;
}
int hcf(int x, int y) {
int i, z;
if (x < y) {
i = x;
x = y;
y = i;
}
z = x % y;
while (z) {
x = y;
y = z;
z = x % y;
}
return (y);
}
int lcd(int x, int y) {
int i, z, m, n;
m = x * y;
if (x < y) {
i = x;
x = y;
y = i;
}
z = x % y;
while (z) {
x = y;
y = z;
z = x % y;
}
n = m / y;
return (n);
}
你的代码出现错误,是因为代码有逻辑错误,在lcd里面,如果z=0,因为发生了除0,所以 在DEV-C++里面,程序发生异常,然后退出。
求最大公约数和最小公倍数,我参考网上一些资料,写了一个实现,如下:
#include <stdio.h>
int gcd(int a, int b);
int lcm(int a, int b);
int main(void){
int a , b;
scanf("%d %d",&a,&b);
printf("a=%d,b=%d\n",a,b);
int g=gcd(a,b);
int l = lcm(a,b);
printf("%d和%d的最大公约数是:%d\n",a,b,g);
printf("%d和%d的最小公倍数是:%d\n",a,b,l);
}
/**
* 辗转相减法
* 算法参考:
* https://blog.csdn.net/yxdayd/article/details/44774015
*/
int gcd(int a, int b){
printf("in gcd a=%d,b=%d\n",a,b);
while(1){
if(a>b)
a-=b;
else if(a<b)
b -=a;
else
return a;
}
}
int lcm(int a, int b){
printf("in lcm a=%d,b=%d\n",a,b);
//最小公倍数是两数乘积除以最大公约数。
//参考链接:https://blog.csdn.net/qq_43527632/article/details/83475439
int gbs = a*b /gcd(a,b);
return gbs;
}