洛谷P1029 最大公约数和最小公倍数问题(c语言版)

问题描述:

这题最开是 我想的  是  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  即确定是否满足要求

欢迎各位大佬补充更简单的    代码思想!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值