视频加载失败

c语言学习简记(2)

439 字
2 分钟
c语言学习简记(2)
  1. 1c语言学习简记(2)本文
  2. 2c语言学习错误简记(1)

前言#

原题来自《c程序设计(第五版)》p137-习题三(真的能说来自它么?这倒可能是很经典的问题吧…)

正文#

以下为自写的作业代码:

#include <stdio.h>
int main(){
int m,n;
int a,c,e,b=0;
scanf("%d%d",&m,&n);
if (m>=n){
for(a=n;a>0;a--){
b++;
if(m%b==0&&n%b==0){
c=b;
}
}
}
else{
for(a=m;a>0;a--){
b++;
if(m%b==0&&n%b==0){
c=b;
}
}
}
if (m>=n){
a=m;
while(1){
if(a%m==0&&a%n==0){
e=a;
break;
}
else{
a++;
continue;
}
}
}
else {
a=n;
while(1){
if(a%m==0&&a%n==0){
e=a;
break;
}
else{
a++;
continue;
}
}
}
printf("%d\n",c);
printf("%d\n",e);
return(0);
}
}

这段作业代码得到了deepseek的检查评价——依旧是“大力出奇迹”的穷举法,旨在展现对循环的基础理解与运用。

不过相对的,大肥鱼也找出来能改进的地方。这段作业代码其实能用数学规律减少一次循环:

两个数的乘积=最大公约数*最小公倍数#

另外,在暴力的机械性的穷举之外,还有更佳的辗转相除法(欧几里得算法)

以下为示例代码:

#include <stdio.h>
int main() {
int m, n, a, b, temp;
printf("请输入两个整数 : ");
scanf("%d%d", &m, &n);
// 保存一下原始值,因为后面 m 和 n 会被改变
a = m;
b = n;
// 核心:辗转相除法求最大公约数 (GCD)
while (n != 0) {
temp = m % n; // 1. 求余数
m = n; // 2. 除数变被除数
n = temp; // 3. 余数变除数
}
// 循环结束后,m 就是最大公约数!
int gcd = m;
// 核心:最大公约数 × 最小公倍数 = 两数乘积
// 所以求最小公倍数 (LCM) 可以瞬间算出来
int lcm = (a * b) / gcd;
printf("最大公约数: %d\n", gcd);
printf("最小公倍数: %d\n", lcm);
return 0;
}

无可否认,这个方法确实比穷举巧妙不少。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

c语言学习简记(2)
https://firefly.cuteleaf.cn/posts/find-gcd-and-lcm/
作者
白园Shiroen
发布于
2026-09-17
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
白园Shiroen
Face the fear,build the future.
分类
标签
站点统计
文章
4
分类
1
标签
4
总字数
712
运行时长
0 天
最后活动
0 天前
文章目录