鱼C论坛

 找回密码
 立即注册
查看: 4228|回复: 9

[技术交流] 小练习:20160822 找出具有一种奇怪约分性质的所有分数

[复制链接]
发表于 2016-8-21 21:48:34 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2016-8-29 10:04 编辑

从现在开始我们要开展一批欧拉计划的习题练习。
其实在我们论坛中已有欧拉计划的板块,可能有些鱼油还没注意到。
什么是欧拉计划:http://bbs.fishc.com/thread-60405-1-1.html
我们欧拉板块现已给出了81道题,这批练习将从欧拉计划中选题。其实用python语言完成有很多的优势,可以更简洁更方便的实现。
如果大家有兴趣也可浏览欧拉的英文网站:https://projecteuler.net/archives
这里已经有了500余题。


                               
登录/注册后可看大图

好了言归正传,我们开始做小练习。




题目要求:
以python语言完成,如果是python2请注明。
程序以代码文字格式发帖。
题目比较简单,注重程序效率和创意。
答题在一周内完成,即8.29 10:00之前,其后将公开大家的答案,并评比成绩。

另程序和答案可以在网上搜到,希望大家独立完成。

----除列出程序外,请给出输出的结果。----


题目:

分数 49/98 是一个奇怪的分数:当一个菜鸟数学家试图对其进行简化时,他可能会错误地可以认为通过将分子和分母上的

9 同时去除得到 49/98 = 4/8。但他得到的结果却是正确的。

我们将 30/50 = 3/5 这样的分数作为普通个例。

一共有四个这样的非普通分数,其值小于 1,并且包括分子和分母都包括 2 位数。

如果将这四个分数的乘积约分到最简式,分母是多少?

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-21 21:50:31 | 显示全部楼层
本题用python自带的分数类型很方便。
结果是100。
  1. from fractions import Fraction
  2. product = 1
  3. for i1 in range(1, 10):
  4.     for i2 in range(0, 10):
  5.         for j in range(1, 10):
  6.             frac = Fraction(i1 * 10 + i2, i2 * 10 + j)
  7.             if frac < 1 and frac == Fraction(i1, j):
  8.                 product *= frac
  9. print(product.denominator)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-22 11:02:56 | 显示全部楼层
本帖最后由 过河的小卒 于 2016-8-22 11:07 编辑
  1. list1 = []
  2. fenzi = 1
  3. fenmu = 1
  4. for i in range(12,99):
  5.     for j in range(11,i):
  6.         if len(set(str(i)+str(j))) < 4 and i%10 != 0 and j%10 != 0 :
  7.             i1 = i%10
  8.             i2 = i//10
  9.             j1 = j%10
  10.             j2 = j//10
  11.             if i1 == j1:
  12.                 if j/i == j2/i2:
  13.                     list1.append((j,i))
  14.                     fenzi = fenzi*j2
  15.                     fenmu = fenmu*i2
  16.             if i1 == j2:
  17.                 if j/i == j1/i2:
  18.                     list1.append((j,i))
  19.                     fenzi = fenzi*j1
  20.                     fenmu = fenmu*i2
  21.             if i2 == j1:
  22.                 if j/i == j2/i1:
  23.                     list1.append((j,i))
  24.                     fenzi = fenzi*j2
  25.                     fenmu = fenmu*i1
  26.             if i2 == j2:
  27.                 if j/i == j1/i1:
  28.                     list1.append((j,i))
  29.                     fenzi = fenzi*j1
  30.                     fenmu = fenmu*i1

  31. print(list1)
  32. print(str(fenzi)+'/'+str(fenmu))
复制代码

输出:
[(16, 64), (26, 65), (19, 95), (49, 98)]
8/800
约分函数懒得写了,答案因该是100

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-22 11:39:50 | 显示全部楼层
  1. from time import time
  2. start=time()

  3. x=1
  4. y=1
  5. #i/j,m/n
  6. j=10
  7. #穷举法,j从11举到99(两位数,且j要比i大)
  8. while j<100:
  9.     j+=1
  10.     i=9
  11.     #i从10举到j-1(两位数,分子要比分母小,这个分数才会比1小)
  12.     while i<j-1:
  13.         m=99
  14.         n=99
  15.         i+=1

  16.         #如果分子的十位跟分母的十位相同,那么m为分子的个位数、n为分母的个位数
  17.         if int(i/10) == int(j/10):
  18.             m=i-int(i/10)*10
  19.             n=j-int(j/10)*10
  20.         #如果分子的个位跟分母的十位相同,那么m为分子的十位数、n为分母的个位数
  21.         elif i-int(i/10)*10 == int(j/10):
  22.             m=int(i/10)
  23.             n=j-int(j/10)*10
  24.         #下边两个判断原理同上
  25.         elif int(i/10) == j-int(j/10)*10:
  26.             m=i-int(i/10)*10
  27.             n=int(j/10)
  28.         elif i-int(i/10)*10 == j-int(j/10)*10:
  29.             m=int(i/10)
  30.             n=int(j/10)
  31.         #如果m<10即上面的四个判断必有一个成立,分子分母里有数字相同,且已舍去
  32.         #j如能被10整除,则属于普通个例,排除掉
  33.         #m/n==i/j成立,把m和n的值记下
  34.         if m<10 and j/10!=int(j/10) and m/n==i/j:   
  35.             x=m*x
  36.             y=n*y
  37. #分数化到最简,莫过于分子为1,即分母除于分子,且能被整除时
  38. #这里偷了懒,我是先求出四个分数后(1/4,2/5,1/5,1/2),一看2和2刚好能约掉,就直接除吧
  39. print(int(y/x))
  40. print(time()-start)
复制代码

  1. >>> ================================ RESTART ================================
  2. >>>
  3. 100
  4. 0.15532398223876953
  5. >>>
复制代码

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-23 10:59:52 | 显示全部楼层
  1. # -*- coding:Utf-8 -*-
  2. import time
  3. start = time.clock()

  4. def check(i,j):
  5.     if i*int(str(j)[0])==j*int(str(i)[1])  and str(j)[1]==str(i)[0]:
  6.         return 1
  7.     else:
  8.         return 0

  9. def gcd(a, b):
  10.     """通过辗转相除法取最大公因数"""
  11.     if a < b:
  12.         a, b = b, a
  13.     y = a % b
  14.     if y == 0:
  15.         return b
  16.     else:
  17.         a, b = b, y
  18.         return gcd(a,b)


  19. list_soure=[]
  20. fz=1
  21. fm=1

  22. for i in range(10,100):
  23.     list_soure.append(i)

  24. for i in range(1,len(list_soure)):
  25.     for j in range(0,i):
  26.         if check(list_soure[i],list_soure[j]):
  27.             fz=fz*list_soure[j]
  28.             fm=fm*list_soure[i]

  29. print(int(fm/gcd(fz,fm)))


  30. end = time.clock()
  31. print ("read: %f s" % (end - start))
复制代码


计算结果:
  1. 100
复制代码

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-23 18:57:04 | 显示全部楼层
  1. import math
  2. l = []
  3. for i in range(1, 10):
  4.     for j in range(i+1, 10):
  5.         for k in range(2, 100):
  6.             if i*k%10 == 0 and i*k//10 == 0 and j*k%10 == 0 and j*k//10 == 0:
  7.                 continue
  8.             if (i*k%10 == j*k//10 and i*k//10*j == j*k%10*i) or (i*k//10 == j*k%10 and i*k%10*j == j*k//10*i):
  9.                 if [i*k,j*k] not in l:
  10.                     l.append([i*k,j*k])
  11. print(l[0][1]*l[1][1]*l[2][1]*l[3][1]//math.gcd(l[0][0]*l[1][0]*l[2][0]*l[3][0],l[0][1]*l[1][1]*l[2][1]*l[3][1]))
复制代码

答案:100

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-24 16:22:20 | 显示全部楼层
  1. import time as t
  2. from fractions import Fraction as F

  3. start = t.time()
  4. def solution():
  5.     result = []
  6.     for i in range(11,79):
  7.         for j in range(21,99):
  8.             if i%10 != 0 and j%10 != 0 and j-i>10:
  9.                 a = str(i)
  10.                 b = str(j)
  11.                 if a[0] == b[1]:
  12.                     c = F(int(a[1]),int(b[0]))
  13.                     if c == F(i,j):
  14.                         result.append(c)
  15.                         print('%s/%s'%(a,b),end = '\t')
  16.                 elif a[1] == b[0]:
  17.                     c = F(int(a[0]),int(b[1]))
  18.                     if c == F(i,j):
  19.                         result.append(c)
  20.                         print('%s/%s'%(a,b),end = '\t')
  21.                 elif a[1] == b[1]:
  22.                     c = F(int(a[0]),int(b[0]))
  23.                     if c == F(i,j):
  24.                         result.append(c)
  25.                         print('%s/%s'%(a,b),end = '\t')

  26.     product = 1
  27.     for k in result:
  28.         product *= k
  29.     print('\n乘积是:%s'%str(product))
  30.     print('最简分母是:%d'%product.denominator)

  31. solution()
  32. print('用时%.5f秒'%(t.time()-start))
复制代码


结果:
16/64        19/95        26/65        49/98       
乘积是:1/100
最简分母是:100
用时0.04688秒

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-26 19:40:04 | 显示全部楼层
sum1 = 1
sum2 = 1
for a in range(10, 99):
    for b in range(a+1, 100):
        if b/a == (b%10)/(a//10):
            sum1 *= a
            sum2 *= b

x = sum2
while sum2 != 0:
    temp = sum1 % sum2
    sum1 = sum2
    sum2 = temp

print(x/sum1)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-28 05:16:02 | 显示全部楼层
答案:100
思路: 满足题设分数满足如下形式:
i/j = (i*10+k)/(k*10+j)
通过列表推倒式得到满足条件的分数
在通过reduce方法求出积
最后通过while方法约分即可求出分母

  1. from time import time as t
  2. from functools import reduce
  3. t0,n = t(),2   

  4.                     
  5. l = reduce(lambda i,j: [i[0]*j[0],i[1]*j[1]],[[i,j] for i in range(10) for j in range(i+1,10) for k in range(1,10) if i*(k*10+j) == j*(i*10 + k)])

  6. while n <= l[0]:
  7.     if l[0] % n == 0 and l[1] % n == 0:
  8.         l[0],l[1] = l[0]//n,l[1]//n
  9.     else:
  10.         n += 1
  11.    
  12. print(l[1],t()-t0)
复制代码

评分

参与人数 1荣誉 +15 鱼币 +15 收起 理由
冬雪雪冬 + 15 + 15 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-28 21:46:16 | 显示全部楼层
  1. fenzi = 1
  2. fenmu = 1
  3. for i in range(11,100):
  4.     for j in range(i+1,100):
  5.         if i%10==0 or j%10 ==0:
  6.             continue
  7.         temp1 = list(str(i))
  8.         temp2 = list(str(j))
  9.         allin = [x for x in temp1 if x in temp2]
  10.         if len(allin)!=1:
  11.             continue
  12.         temp1.remove(allin[0])
  13.         temp2.remove(allin[0])
  14.         if i/j == (int(temp1[0])/int(temp2[0])):
  15.             fenzi = fenzi * i
  16.             fenmu = fenmu * j
  17. print(fenzi/fenmu)
  18. from fractions import Fraction
  19. Fraction(fenzi,fenmu)
复制代码

输出结果:0.01
化为分式:1/100
所以结果是:100

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-21 15:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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