QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

版主

Rank: 20Rank: 20Rank: 20Rank: 20

技术值
查看: 765|回复: 31

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

[复制链接]
最佳答案
495 
累计签到:714 天
连续签到:13 天
冬雪雪冬 发表于 2017-11-14 11:47:28 76531 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

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

本帖被以下淘专辑推荐:

楼层
跳转到指定楼层
最佳答案
221 
累计签到:240 天
连续签到:9 天
SixPy 发表于 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

查看全部评分

最佳答案
1 
累计签到:7 天
连续签到:1 天
wyp02033 发表于 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

查看全部评分

最佳答案
0 
累计签到:42 天
连续签到:18 天
口可口可 发表于 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

查看全部评分

最佳答案
208 
累计签到:160 天
连续签到:9 天
BngThea 发表于 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

查看全部评分

最佳答案
0 
累计签到:54 天
连续签到:1 天
wc365 发表于 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

查看全部评分

最佳答案
10 
累计签到:10 天
连续签到:1 天
bush牛 发表于 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 没有约分

查看全部评分

最佳答案
1 
累计签到:280 天
连续签到:5 天
solomonxian 发表于 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

查看全部评分

最佳答案
0 

尚未签到

lihw 发表于 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 没有约分

查看全部评分

最佳答案
1 
累计签到:21 天
连续签到:1 天
aegis1417 发表于 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 没有约分

查看全部评分

最佳答案
9 
累计签到:256 天
连续签到:10 天
xindong 发表于 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

查看全部评分

最佳答案
3 
累计签到:15 天
连续签到:4 天
colinshi 发表于 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时出错  发表于 6 天前
最佳答案
0 
累计签到:9 天
连续签到:2 天
cyz1993 发表于 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

查看全部评分

最佳答案
0 

尚未签到

jay_mu 发表于 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 分子和分母应该给出整数

查看全部评分

最佳答案
0 
累计签到:4 天
连续签到:1 天
Easonalan 发表于 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

查看全部评分

最佳答案
0 
累计签到:163 天
连续签到:1 天
帅帅的平少 发表于 2017-11-17 17:21:08 | 显示全部楼层
先看看
最佳答案
0 
累计签到:21 天
连续签到:1 天
Python玲玲 发表于 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)#不能够化简为最简式,有待改进
复制代码

点评

没有约分  发表于 6 天前

评分

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

查看全部评分

最佳答案
0 
累计签到:2 天
连续签到:1 天
DoctorTai 发表于 7 天前 From FishC Mobile | 显示全部楼层
谢谢谢谢
最佳答案
0 
累计签到:2 天
连续签到:1 天
17803160 发表于 7 天前 | 显示全部楼层
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 题目要求不用自带的分数类型

查看全部评分

最佳答案
0 
累计签到:2 天
连续签到:1 天
qad0510 发表于 7 天前 | 显示全部楼层
1

发表回复

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

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /1 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-11-25 11:56

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