问题描述:
这题最开是 我想的 是 i j 双循环嵌套 遍历一遍 时间复复杂度O(n^2)
过不了这题 有两个测试点 时间超时
代码截图:
双循环进来判断 这样子来穷举 过不了这题AC
所以更新了算法:
利用一个循环 首先 P*Q=x*y 两数相乘=他们的最小公倍数 X 最大公约数
这个很好理解
所以这里就用一个循环 i j用上述进行替换
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x = 0, y = 0;
scanf("%d %d", &x, &y); //x最大公约数 y最小公倍数
int i = 0;
int j = 0;
int floag = 0;
for (i = x; i <= y; i = i + x)
{
if (((x * y) % i) == 0)
j = (x * y) / i;
else
continue;
int min = i;
int max = j;
while (max != 0)
{
int jet = min;
min = max;
max = jet % max;
}
if (min == x)
{
floag++;
//printf("%d %d\n", i, j);
}
}
printf("%d", floag);
return 0;
}
代码解释:首先 p q都是整数 所以if来判断一下 如果不是整数 就跳过下面的操作
每次加x是因为 他们的最大公约数是x所以 必是x的倍数
这里用辗转相除法 来求i j的最大公因数 看是不是x 即确定是否满足要求
欢迎各位大佬补充更简单的 代码思想!!!