鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 冬雪雪冬

[技术交流] Python:每日一题 124

[复制链接]
发表于 2017-11-18 15:54:12 | 显示全部楼层
def fracAdd(fractop1,fracbottom1,fractop2,fracbottom2):
    frac_top1 = fractop1
    frac_top2 = fractop2
    frac_bottom1 = fracbottom1
    frac_bottom2 = fracbottom2
    if frac_bottom1 == frac_bottom2:
        frac_top3,frac_bottom3 = frac_top1+frac_top2,frac_bottom1
    else:
        frac = frac_top1,frac_bottom1
        frac_top1*=frac_bottom2
        frac_bottom1*=frac_bottom2
        frac_top2*=frac[1]
        frac_bottom2*=frac[1]
        frac_top3 = frac_top1+frac_top2
        frac_bottom3 = frac_bottom1
    return (frac_top3,frac_bottom3)

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1 没有约分

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-18 20:27:02 | 显示全部楼层
def lcm(x, y): # 最小公倍数
    s= x*y
    while y:
        x, y = y, x%y
    return s//x

def fracAdd(num1, deno1, num2, deno2):
    if deno1 == deno2: # 分母相同
        return((num1+num2, deno1))
    else: # 分母不相同
        comm = lcm(deno1, deno2)
        new_num1 = comm // deno1 * num1
        new_num2 = comm // deno2 * num2
        new_num = new_num1 + new_num2
        return((new_num,comm))
if __name__ == '__main__':
    print(fracAdd(1, 2, 5, 4))

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1 没有约分

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-18 22:03:15 | 显示全部楼层
import random as r

class Solution:
    def fracAdd(self, mo_1, den_1, mo_2, den_2):
        """
        :type mo_1, den_1, mo_2, den_2: int
        :rtype: tuple
        """
        if den_1 == 0 or den_2 == 0:
            return "请输入分母非零的分数"
        else:
            den_3 = den_1 * den_2
            temp_1 = mo_1 * den_2
            temp_2 = mo_2 * den_1
            mo_3 = temp_1 + temp_2
            if mo_3 == 0:
                return(0, 0)
            else:
                factor= self.judge(mo_3, den_3)
                mo_3 //= factor
                den_3 //= factor
                return (mo_3, den_3)

    def judge(self, x, y):
        a = min(abs(x), abs(y))
        factor = 1
        for i in range(2, (a+3)//2):
            if x % i == 0 and y % i == 0:
                factor = i
        if x * y > 0:
            return factor
        elif x * y < 0:
            return -factor

# 测试用例
a = Solution()
range_area = [-100,100]
n = 100
for i in range(n):
    mo_1 = r.randint(range_area[0],range_area[1])
    den_1 = r.randint(range_area[0],range_area[1])
    mo_2 = r.randint(range_area[0],range_area[1])
    den_2 = r.randint(range_area[0],range_area[1])
    print(mo_1, den_1, mo_2, den_2, a.fracAdd(mo_1, den_1, mo_2, den_2), end='\n')

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1 没有约分

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-18 22:03:48 | 显示全部楼层
本帖最后由 黎芃荨 于 2017-11-18 22:06 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-19 00:44:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-19 11:50:47 | 显示全部楼层
本帖最后由 776667 于 2017-11-19 12:12 编辑
def fracAdd(a,b,c,d):

    def gcd(x,y):
        if y == 0:
            return x
        return gcd(y,x%y)

    a *= d
    c *= b
    b *= d
    numerator = (a+c)//gcd(sorted([a+c,b])[1],sorted([a+c,b])[0])
    b = b//gcd(sorted([a+c,b])[1],sorted([a+c,b])[0])
    return (numerator,b)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-19 16:19:03 | 显示全部楼层
# 加上约分了

def lcm(x, y): # 最小公倍数
    s= x*y
    while y:
        x, y = y, x%y
    return s//x

def gcd(x,y): # 最大公约数
    return x if y == 0 else gcd(y, x%y)

def fracAdd(num1, deno1, num2, deno2):
    if deno1 == deno2: # 分母相同
        return((num1+num2, deno1))
    else: # 分母不相同
        comm = lcm(deno1, deno2)
        new_num1 = comm // deno1 * num1
        new_num2 = comm // deno2 * num2
        new_num = new_num1 + new_num2
        igcd = gcd(new_num, comm)
        return((new_num//igcd,comm//igcd))
if __name__ == '__main__':
    print(fracAdd(1, 2, 6, 4)) # (2,1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-21 07:09:17 | 显示全部楼层
def gcd(x, y):   
    # 计算最大公约数,运用欧几里得算法,即两个数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
    return x if y == 0 else gcd(y, x % y)


def fracAdd(n_1, d_1, n_2, d_2):    # 输入 分子1, 分母1, 分子2, 分母2
    # 通分成同分母,然后分子相加
    d_3 = d_1 * d_2
    n_1 *= d_2
    n_2 *= d_1
    n_3 = n_1 + n_2

    # 除以最大公约数
    factor = gcd(d_3, n_3)
    d_3 //= factor
    n_3 //= factor
    return n_3, d_3


n_1, d_1, n_2, d_2 = map(int, input('请分别输入分子1, 分母1, 分子2, 分母2:').split(','))
print(fracAdd(n_1, d_1, n_2, d_2))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-22 16:24:08 From FishC Mobile | 显示全部楼层
SixPy 发表于 2017-11-14 12:48

写的逻辑挺清楚的,容易看懂。赞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-23 15:59:53 | 显示全部楼层
def fenzi(a,b,c,d):
    x=a*d+c*b
    y=b*d
    if x>y:
        n=y
    else:
        n=x
    while True:
        if x%n==0 and y%n==0:
            x=x/n
            y=y/n
        n=n-1
        if n==0:
            break
    return int(x),int(y)

s=fenzi(18,24,1,1)
print(s)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-28 11:20:34 | 显示全部楼层
def fracAdd(分子1, 分母1, 分子2, 分母2):
    a = 分母1*分母2
    b = 分子1*分母2 + 分子2*分母1
    #目标分数为b/a,需约分
    n = min(abs(b),abs(a))
    for i in range(n,0,-1):
        if a%i==0 and b%i==0:
            a = a//i
            b = b//i
            break
    return (b, a)


print(fracAdd(1, 6, 2, 3))

#输出:(5, 6)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-29 14:58:06 | 显示全部楼层
def fracAdd(mole_0,deno_0,mole_1,deno_1):
    denominator=1
    while denominator%deno_0 != 0 or denominator%deno_1 != 0:
        denominator+=1

    multiple_0=denominator/deno_0
    multiple_1=denominator/deno_1

    molecule_0=multiple_0*mole_0
    molecule_1=multiple_1*mole_1

    result_mole=int(molecule_0+molecule_1)
    result_deno=denominator
    return (result_mole,result_deno)

print('fracAdd(1,6,2,3)')
print(fracAdd(1,6,2,3))

mole_0=int(input("please enter the molecule of the first number:"))
deno_0=int(input("please enter the denominator of the first number:"))

mole_1=int(input("please enter the molecule of the second number:"))
deno_1=int(input("please enter the denominator of the first number:"))

print(fracAdd(mole_0,deno_0,mole_1,deno_1))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-18 19:51:51 | 显示全部楼层
def fun124(*arg):
    mol1 = arg[0]
    m = den1 = arg[1]
    mol2 = arg[2]
    n = den2 = arg[3]

    #求分母最小公倍数
    if m > n:
        m, n = n, m
    r = m%n
    while r:
        m = n
        n = r
        r = m%n

    str1 = "%d/%d" % ((mol1 * den2 + mol2 * den1) / n, den1 * den2 / n )
    return str1


print(fun124(1,6,5,3))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-1 18:21:21 | 显示全部楼层
from math import gcd
def fracAdd(a,b,c,d):
  n1,n2=a*d+b*c,b*d
  n=gcd(n1,n2)
  return n1//n,n2//n
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-25 17:36:51 | 显示全部楼层
def fracAdd(n1,d1,n2,d2):
    def gcd(a, b):
        return (a if b == 0 else gcd(b, a % b))
    n3,d3=n1*d2+n2*d1,d1*d2
    return n3//gcd(n3,d3),d3//gcd(n3,d3)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-1 09:03:56 | 显示全部楼层
def fracAdd(a, b, c, d):
    if b % d == 0:
        k = b // d
        return (a + c * k, b)
    elif d % b == 0:
        k = d // b
        return (a * k + c, d)
    else:
        return (a * d + b * c, b * d)
        fracAdd
        
print(fracAdd(1, 6, 2, 3))
print(fracAdd(3, 4, 5, 8))
print(fracAdd(3, 5, 5, 8))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 03:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表