c语言学习简记(2)
439 字
2 分钟
c语言学习简记(2)
- 1c语言学习简记(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;}无可否认,这个方法确实比穷举巧妙不少。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!








