*HJ108.求最小公倍数
描述
正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
数据范围:1≤𝑎,𝑏≤100000
输入描述:
输入两个正整数A和B。
输出描述:
输出A和B的最小公倍数。
示例1
输入:5 7
输出:35
示例2
输入:2 4
输出:4
求两个正整数A和B的最小公倍数(LCM),最快的方法是利用辗转相除法求最大公约数(GCD)。
LCM(A,B)=A×B/GCD(A,B)
使用欧几里得算法(Euclidean Algorithm)来计算最大公约数:
A和B的最大公约数等于A与(B除以A的余数)的最大公约数
即:GCD(A,B) = GCD(B%A,A),可不要求A<=B,执行一次自动反转。
import sys
A,B = map(int,input().split())
def gcd(a,b):
while b:
a,b = b,a%b
return a
def lcm(c,d):
return (c*d) //(gcd(c,d))
result = lcm(A,B)
print(result)
辗转相除法基于原理“两个整数的最大公约数等于其中较小值与两数相除余数的最大公约数”,即“Greatest Common Divisor (GCD)递归原理”,用公式表示为:
GCD(a,b) = GCD(b,a%b)
*HJ60.查找组成一个偶数最接近的两个素数
描述
任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。
数据范围:输入的数据满足 4≤𝑛≤1000
输入描述:
输入一个大于2的偶数
输出描述:
从小到大输出两个素数
示例1
输入:20
输出:
7 13
示例2
输入:4
输出:
2
2
小垃圾代码
import sys
import math
def is_prime(x:int):
if x <=1:
return False
for i in range(2,int(math.sqrt(x))+1):
if x%i==0:
return False
return True
n = int(input())
for i in range(n//2,n):
if is_prime(i):
j = n-i
if is_prime(j):
print(j)
print(i)
break
思路一样,但代码更简洁成熟
def isPrime(i):
for j in range(2, i):
if i % j == 0:
return False
return True
n = int(input())
for i in range(n//2, 1, -1):
# 检查是否为素数
if isPrime(i) and isPrime(n-i):
print(i, n-i, sep = '\n')
break
素数判断 + 循环找最接近(从n/2开始)