先是题目:P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
之前ccpc见过gcd函数,今天看到了,记录一下,比赛好像不能直接使用gcd函数,需要单独写进去,因此,我找到一个能过的写法
如下:
int gcd(int a, int b) {
int r;
while (b > 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
因此本题代码
#include<iostream>
#include<algorithm>
using namespace std;
int m, n, ans;
int gcd(int a, int b) {
int r;
while (b > 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
int main()
{
cin >> m >> n;
if (m == n)ans--;
n *= m;
for (int i = 1; i*i<=n; i++)
{
if (n % i == 0 && gcd(i, n / i) == m) ans += 2;
}
cout << ans;
return 0;
}
最小公倍数=(a*b)/最大公因数。
思路是:我们应该知道,两个数的积等于它们最大公约数和它们最小公倍数的积。(自己好好理解一下)所以满足条件的两个数的积一定是读入的两个数的积。所以做法就很显然了,枚举一个数,判断它能否被读入的两个数的积整除,如果可以再判断它和两个数的积除以它所得的数的最大公约数和读入的最大公约数是否相同,如果相同则ans++,(因为积相同而且最大公约数相同,那么最小公倍数也一定相同)最后输出ans。