正整数 a 和正整数 b 的最小公倍数,是指能被 a 和 b 整除的最小的正整数。请你求 a 和 b 的最小公倍数。
比如输入5和7,5和7的最小公倍数是35,则需要返回35。
本题数据范围不大,使用枚举可通过前 5 个点(第六个点会卡 1 ms)
方法一:直接枚举
// 不是满分,谨慎枚举 #include <bits/stdc++.h> using namespace std; int main(){ long long a,b,i; cin>>a>>b; for(i=1;i%a!=0||i%b!=0;i++){ // 如果 i 不是其中某个数的倍数,就继续枚举 // 纯枚举,这里什么也不用做 } cout<<i; return 0; }
方法二:两个数的最小公倍数=两个数的乘积÷两个数的最大公约数 (满分)
两个数较大时,可以改为 一个数÷两个数的最大公约数×另一个数,防止溢出。但本题数据范围小,不需要考虑溢出。
#include <bits/stdc++.h> using namespace std; int gcd(int a,int b){ if(b==0) return a; else return gcd(b,a%b); } int main(){ /* 读写优化,新手可忽略 ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); */ long long a,b; cin>>a>>b; cout<<a*b/gcd(a,b); return 0; }
public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextInt()) { // 注意 while 处理多个 case int a = in.nextInt(); int b = in.nextInt(); System.out.println((a * b) / ans(a, b)); } } public static int ans(int a, int b) { int max = Math.max(a, b); // 最大值 int min = Math.min(a, b); // 最小值 int ans = max - min; // 最大值减去最小值 if (ans == min) { // 差等于减数结束递归 return ans; } return ans(ans, min); }
#include <stdio.h> long long getNum(long long x, long long y) { while (x % y != 0) { long long temp = x % y; x = y; y = temp; } return y; } int main() { long long a = 0; long long b = 0; scanf("%lld %lld",&a,&b); long long ret = getNum(a,b); printf("%lld\n",(a*b)/ret); return 0; }
#include <iostream> using namespace std; int main() { int a,b; cin>>a>>b; //判断ab谁大 int max=a; int min=b; if(max<min) { //不符合大小规律 交换 max=b; min=a; } //枚举有限情况 for(int i=1;i<=min;i++) { long long temp=i*max; if(temp%min==0) { cout<<temp; break; } } } // 64 位输出请用 printf("%lld")