题目是这样的,想问一下各位友友还能怎么优化,让它变快
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int Pan(int min,int p,int q)
{
int m = p < q ? p : q;
for(m=m;m>=min;m--)
{
if (p % m == 0 && q % m == 0)
{
if (m == min)
return 1;
else
return 0;
}
}
return 0;
}
int main()
{
int x = 0, y = 0;
scanf("%d%d", &x, &y); int count = 0; int mix = x * y;
int max = x > y ? x : y; int p = 0, q = 0; int min = mix / max;
for (p = min;p<=max/2 ; p++)
{
for (q=p;q<=max;q++)
{
if (Pan(min, p, q) == 1)
{
if ((p * q) / min == max)
count++;
}
}
}
printf("%d", count*2);
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:首先,需要明确最大公约数和最小公倍数的定义和计算方法。
最大公约数(GCD)是指两个或多个整数共有约数中最大的一个数。求两个数的最大公约数可以使用辗转相除法,即一直用两个数的较小数去除较大数,直到余数为0,此时的除数就是最大公约数。
最小公倍数(LCM)是指可同时被两个或多个整数整除的最小正整数。求两个数的最小公倍数可以利用最大公约数的性质,即最小公倍数等于两个数的乘积除以最大公约数。
优化方法: 1. 在计算最大公约数时,可以使用更高效的算法,如欧几里得算法(辗转相除法)。可以将参考资料中的gcd方法进行调用。
def gcd(a, b):
while b != 0:
temp = a % b
a = b
b = temp
return a
def lcm(a, b):
return a * b // gcd(a, b)
代码示例:
def gcd(a, b):
while b != 0:
temp = a % b
a = b
b = temp
return a
def lcm(a, b):
return a * b // gcd(a, b)
def calculate_gcd_and_lcm(numbers):
gcd_result = gcd(numbers[0], numbers[1])
lcm_result = lcm(numbers[0], numbers[1])
for i in range(2, len(numbers)):
gcd_result = gcd(gcd_result, numbers[i])
lcm_result = lcm(lcm_result, numbers[i])
return gcd_result, lcm_result
numbers = [12, 18, 24]
gcd_result, lcm_result = calculate_gcd_and_lcm(numbers)
print("最大公约数:", gcd_result)
print("最小公倍数:", lcm_result)
输出结果: 最大公约数: 6 最小公倍数: 72
通过以上优化方法,可以提高最大公约数和最小公倍数的计算速度。
可以google下,辗转相除法,循环几次即可得到