鱼C论坛

 找回密码
 立即注册
查看: 6615|回复: 37

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

[复制链接]
发表于 2017-11-14 11:47:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2017-11-19 15:17 编辑

先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。
题目:
上一天难度有点大,为了让更多的鱼油参与,这回来个简单的。
定义一个函数,参数为两个分数,返回值为这两个分数之和,也用分数的型式表示。
注:python本身有分数的数据类型,为了考察大家的能力,就不要用本身的分数类型了。

  1. def fracAdd(分子1, 分母1, 分子2, 分母2):
  2.     #你的程序
  3.     return (分子3, 分母3)
复制代码


例如:
1/6 + 2/3 = 5/6
fracAdd(1, 6, ,2, 3)
#返回 (5, 6)

注意如果碰到一又四分之三,显示 7/4

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-11-14 12:48:36 | 显示全部楼层
  1. def fracAdd(分子1, 分母1, 分子2, 分母2):
  2.     def 约分(x,y):
  3.         公因数 = ({i for i in range(2,int(x**.5)+1)if x%i==0} &
  4.                  {i for i in range(2,int(y**.5)+1)if y%i==0})
  5.         for 因子 in 公因数:
  6.             x //= 因子
  7.             y //= 因子
  8.         return x,y
  9.         
  10.     分子3, 分母3 = 约分((分子1*分母2 + 分子2*分母1), 分母1*分母2)
  11.     return 分子3, 分母3

  12. print(fracAdd(1, 6, 2, 3))
  13. #(5, 6)
  14. print(fracAdd(18, 24, 1, 1))
  15. #(7, 4)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-14 13:34:16 | 显示全部楼层
  1. def get_gcd(x, y):
  2.     if y == 0:
  3.         return x
  4.     else:
  5.         return get_gcd(y, x%y)
  6. def fracAdd(molecular1, denominator1, molecular2, denominator2):
  7.     gcd = get_gcd(denominator1, denominator2)
  8.     denominator = denominator1 * denominator2 / gcd
  9.     molecular = (molecular1 * denominator2 / gcd) + (molecular2 * denominator1 / gcd)

  10.     new_gcd = get_gcd(molecular, denominator)

  11.     return [int(molecular/new_gcd), int(denominator/new_gcd)]

  12. print(fracAdd(1, 2, 1, 3))
复制代码

执行结果:[5, 6]

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-14 14:08:32 | 显示全部楼层
本帖最后由 口可口可 于 2017-11-14 14:10 编辑
  1. def gcd(x, y):   
  2.     # 计算最大公约数,运用欧几里得算法,即两个数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
  3.     return x if y == 0 else gcd(y, x % y)


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

  10.     # 除以最大公约数
  11.     factor = gcd(d_3, n_3)
  12.     d_3 //= factor
  13.     n_3 //= factor
  14.     return n_3, d_3


  15. n_1, d_1, n_2, d_2 = map(int, input('请分别输入分子1, 分母1, 分子2, 分母2:').split(','))
  16. print(fracAdd(n_1, d_1, n_2, d_2))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-14 14:52:32 | 显示全部楼层
  1. def fracAdd(n1,d1,n2,d2):
  2.     n = n1 * d2 + n2 * d1
  3.     d = d1 * d2
  4.     x,y = max(n,d),min(n,d)
  5.     while y:
  6.         x, y = y, x % y
  7.    
  8.     return n // x, d // x

  9. print(fracAdd(1, 6, 2, 3))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-14 17:13:08 | 显示全部楼层
  1. def hcf(x, y):
  2.     """该函数返回两个数的最大公约数"""
  3.     if x > y:
  4.         smaller = y
  5.     else:
  6.         smaller = x
  7.     for i in range(1,smaller + 1):
  8.         if((x % i == 0) and (y % i == 0)):
  9.             hcf = i
  10.     return hcf

  11. def fracAdd(a,b,c,d):
  12.     e,f = a*d + b*c , b*d
  13.     hc = hcf(e,f)
  14.     e //= hc
  15.     f //= hc
  16.     return (e,f)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-14 17:16:36 | 显示全部楼层
  1. def fracAdd(top,bottom,up,down):
  2.     a = max(bottom, down)
  3.     n = min(bottom, down)
  4.     if a % n == 0:
  5.         if a == bottom:
  6.             return (top+up*int(a/n), a)
  7.         return (up+top*int(a/n), a)
  8.     return (top*down+bottom*up, bottom*down)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-14 18:40:01 | 显示全部楼层
本帖最后由 solomonxian 于 2017-11-14 18:50 编辑

分数加减貌似前面做过了,当时先找最大公约数
现在不管效率了
  1. def fracAdd(a, b, c, d):
  2.     r1, r2 = a*d + b*c, b*d
  3.     for i in range(r2, 0, -1):
  4.         if not (r1 % i or r2 % i):
  5.             return r1//i, r2//i
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-14 20:09:03 | 显示全部楼层
  1. def fracAdd(a,b,c,d):
  2.     num=2
  3.     if b%d==0 or d%b==0:
  4.         if b%d==0:
  5.             f=a+c*(b//d)
  6.             g=b
  7.         if d%b==0:
  8.             f=a*(d//b)+c
  9.             g=d
  10.     else:
  11.         if b>d:
  12.             t=b
  13.             while t*num%d !=0:
  14.                 num +=1
  15.         else:
  16.             t=d
  17.             while t*num%b !=0:
  18.                 num +=1
  19.         
  20.         
  21.         f= a*(t*num//b)+c*(t*num//d)
  22.         g=t*num   
  23.     return(f,g)

复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-14 23:11:55 | 显示全部楼层
歐拉計畫的題目有些是真的要數學系的才知道...

  1. def gcd(a, b):
  2.     while b:
  3.         a, b = b, a%b
  4.     return a

  5. def lcm(a, b):
  6.     return a * b // gcd(a, b)

  7. def fracAdd(nu1,de1,nu2,de2):
  8.             x=lcm(de1, de2)  #通分
  9.             y=nu1*(x//de1)+nu2*(x//de2)
  10.             return (y,x)

  11. print(fracAdd(1, 6, 2, 3))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-15 13:55:33 | 显示全部楼层
加完了,还要求最大公约数:

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Wed Nov 15 12:02:30 2017

  4. """

  5. def fracAdd(n1, d1, n2, d2):
  6.     n3 = d1*n2 + d2*n1
  7.     d3 = d1*d2
  8.    
  9.     c3 = commonDivisor2(n3, d3)
  10.    
  11.     return (int(n3/c3), int(d3/c3))

  12. def commonDivisor2(num1,num2):   
  13.     if num1==num2:return num1
  14.     elif num1 < num2:
  15.         temp = num1
  16.         num1 = num2
  17.         num2 = temp
  18.     if num1 - num2 == num2:
  19.         return num2
  20.     else:
  21.         temp = num1
  22.         num1 = num2
  23.         num2 = temp - num2
  24.         #print (num1,' ', num2)
  25.         return commonDivisor2(num1,num2)     

  26. test = fracAdd(1, 6, 2, 3)
  27. print ('1 / 6 + 2 / 3 = ', test[0],'/',test[1])

  28. test = fracAdd(1, 4, 7, 8)
  29. print ('1 / 4 + 7 / 8 = ', test[0],'/',test[1])


  30. test = fracAdd(1, 6, 1, 3)
  31. print ('1 / 6 + 1 / 3 = ', test[0],'/',test[1])
复制代码



1 / 6 + 2 / 3 =  5 / 6
1 / 4 + 7 / 8 =  9 / 8
1 / 6 + 1 / 3 =  1 / 2

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-15 15:00:56 | 显示全部楼层
  1. def fracAdd(a,b,c,d):
  2.     yueshu = []
  3.     if b == 0 or d == 0:
  4.         return '分母不能为零'
  5.     elif a == 0 :
  6.         return (c,d)
  7.     elif c == 0:
  8.         return (a,b)
  9.     else:
  10.         i = (a*d)+(b*c) #分子
  11.         j = (b*d)   #分母
  12.         if i == j:
  13.             return (1,1)
  14.         elif i == 1 or j == 1:
  15.             return(i,j)
  16.         else:
  17.             x,y = i,j
  18.             while x % y != 0:#求最大公约数
  19.                 if y > x:
  20.                     x,y=y,x
  21.                 z = y
  22.                 y = x%y
  23.                 x = z
  24.             i = i//y
  25.             j = j//y
  26.         return (i,j)
复制代码

点评

参数为1,6,1,3时出错  发表于 2017-11-19 15:24
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-16 13:27:03 | 显示全部楼层
  1. def fracadd(a,al,b,bl):
  2.     fenzi=a*bl+b*al
  3.     fenmu=al*bl
  4.     c=gongyue(fenzi,fenmu)
  5.     print(fenzi//c,fenmu//c)
  6. def gongyue(a,b):   
  7.     c=0
  8.     d=max(a,b)
  9.     for i in range(1,d):
  10.         if (not a%i) and (not b%i):
  11.             c=i
  12.     return c
  13. fracadd(1,7,2,3)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-16 23:34:59 | 显示全部楼层
  1. def fracAdd(fz1,fm1,fz2,fm2):

  2.     fz3 = fz1*fm2+fz2*fm1
  3.     fm3 = fm1*fm2
  4.     a=fz3
  5.     b=fm3
  6.     while b:
  7.         temp = a%b
  8.         a = b
  9.         b =temp
  10.     gcd = a
  11.     print(gcd)
  12.     return (fz3/a,fm3/a)




  13. print(fracAdd(1,6,2,3))
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 分子和分母应该给出整数

查看全部评分

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

使用道具 举报

发表于 2017-11-17 16:47:30 | 显示全部楼层
# -*- coding: utf-8 -*-
"""
Created on Fri Nov 17 11:26:53 2017
FishC 习题2017-11-17
@author: Creative EveryDay
"""
def Factorization(N):
    N = int(N)
    FactorList = []
    for count in range(2,N+1):
        while N%count ==0:
            N = N/count
            FactorList.append(count)
    return FactorList
def FracAdd(num1,den1,num2,den2):
    CommonFactor = 1
    num = den2*num1 + den1*num2
    den = den1*den2
    ListN = Factorization(num)
    ListD = Factorization(den)
    if num%den == 0:
        num = num/den
        den = 1
    else:
        for i in ListN:
            if i in ListD:
                CommonFactor = CommonFactor*i
                ListD.remove(i)
    num = int(num/CommonFactor)
    den = int(den/CommonFactor)        
    return (num,den)

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-17 17:21:08 | 显示全部楼层
先看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-17 21:28:26 | 显示全部楼层
  1. def fracAdd(分子1,分母1,分子2,分母2):
  2.     分母3 = 分母1 * 分母2
  3.     分子3 = 分子1*分母2+分子2*分母1
  4.     return(分子3,分母3)#不能够化简为最简式,有待改进
复制代码

点评

没有约分  发表于 2017-11-19 15:27

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-18 11:32:08 From FishC Mobile | 显示全部楼层
谢谢谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-18 13:20:44 | 显示全部楼层
import fractions


def fracADD(a1,a2,b1,b2):
    a = fractions.Fraction((fractions.Fraction(a1,a2)+fractions.Fraction(b1,b2)))
    print(a)
    return a


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

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1 题目要求不用自带的分数类型

查看全部评分

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 23:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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