3 条题解
-
2程睿 (Raych123) LV 10 @ 2023-09-23 15:38:37
题目看似复杂,实际上简化完毕后就是给定a,b,c三个数求它们的最大公约数
所以有以下三种方法方法1: 短除法
def gcd1(a,b) : t=1 for i in range(2,min(a,b)+1) : while (a%i==0 and b%i==0) : t*=i a/=i b/=i return t
这是最简单的一种方法,其核心思路为遍历2到a与b之间最小值的所有数(其实只需要遍历所有质数但这里数据实在太小所以可以偷懒awa)如果此数同时是ab的约数,就记录并从ab中除去它,最后返回记录的所有数的积即可
方法2: 辗转相除法
def gcd2(a,b) : if (a<b) : a,b=b,a t=a%b while t!=0 : a=b b=t t=a%b return b
知名度最高的方法(?),从a/b开始用当前余数除以上一步余数直到除尽为止,此时余数就是最大公约数(第一步swap操作有没有不影响)
方法3: 更相减损法
def gcd3(a,b) : t=0 while a%2==0 and b%2==0 : a/=2 b/=2 t+=1 while a!=b : if a>b : a-=b elif a<b : b-=a return b*(2**t)
先除去所有的公约数2,然后不断用较大数减较小数直到两数相等,这个值和最开始除去的所有2相乘就是结果
求完最大公约数之后abc同时除以它们的最大公约数然后将结果相乘即为答案
完整代码:
#短除法 def gcd1(a,b) : t=1 for i in range(2,min(a,b)+1) : while (a%i==0 and b%i==0) : t*=i a/=i b/=i return t #辗转相除法 def gcd2(a,b) : if (a<b) : a,b=b,a t=a%b while t!=0 : a=b b=t t=a%b return b #更相减损法 def gcd3(a,b) : t=0 while a%2==0 and b%2==0 : a/=2 b/=2 t+=1 while a!=b : if a>b : a-=b elif a<b : b-=a return b*(2**t) a=int(input()) b=int(input()) c=int(input()) #abc相乘之后除去最大公约数的立方 print(int(a*b*c/gcd1(gcd1(a,b),c)**3)) #法1 #print(int(a*b*c/gcd2(gcd2(a,b),c)**3)) #法2 #print(int(a*b*c/gcd3(gcd3(a,b),c)**3)) #法3
完结撒花
-
12020-09-14 21:00:59@
a=int(input())
b=int(input())
c=int(input())
v=a*b*c
d=0
if a<b:
d=a
else:
d=b
if d<c:
d=d
else:
d=c
i=d
e=0
while i>=1:
if a%i==0 and b%i==0 and c%i==0:
e=i
break
i=i-1
print(int(v/(e**3))) -
02021-01-15 22:49:21@
import math
a=int(input())
b=int(input())
c=int(input())
k=min(a,b,c)
k+=1
x=1
y=1
z=1
while x!=0 or y!=0 or z!=0:
{
k-=1
x=a%k
y=b%k
z=c%k
}
w=a/k
e=b/k
r=c/k
d=int(w*e*r)
print(d)
- 1
信息
- ID
- 1006
- 难度
- 8
- 分类
- (无)
- 标签
- (无)
- 递交数
- 623
- 已通过
- 68
- 通过率
- 11%
- 上传者