鱼C论坛

 找回密码
 立即注册
查看: 4629|回复: 12

[技术交流] python小练习(036):渐进的完全平方数

[复制链接]
发表于 2016-12-4 14:48:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jerryxjr1220 于 2016-12-4 15:00 编辑

python小练习(035),传送门

今天我们来研究一下:渐进的完全平方数

正整数 n 被 d 除所得的商和余数分别为 q 和 r。此外,d,q 和 r 是一个等比数列中的连续三项,但未必是有序的。

例如,58 除以 6,商为 9,余数为 4。可知 4,6,9 是公比为 3/2 的等比数列中的连续三项。

我们将这样的 n 成为渐近数。

有的渐近数同时也是完全平方数,比如 9 和 10404=102**2。

100以内只有9既是渐进数又是完全平方数,所以100以内的完全平方渐进数之和是9.

100000 以下所有的完全平方渐近数之和是 124657。

求 10**8 以下所有完全平方渐近数之和。


本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-6-22 12:34:52 From FishC Mobile | 显示全部楼层
程序效率不行
  1. d=[]
  2. a=[]
  3. b=0
  4. for i in range(2,105):
  5.     k=i**2
  6.     for j in range(2,k):
  7.         
  8.         s=k//j
  9.         y=k%j
  10.         if y!=0:
  11.             
  12.             a.append([j,s,y])
  13.             #print(a)
  14.             a[b].sort()
  15.             #print(a[b])
  16.             if a[b][2]/a[b][1]==a[b][1]/a[b][0]:
  17.                 d.append(k)
  18.             b+=1

  19. d=list(set(d))
  20. print(d)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-22 12:34:59 From FishC Mobile | 显示全部楼层
程序效率不行
  1. d=[]
  2. a=[]
  3. b=0
  4. for i in range(2,105):
  5.     k=i**2
  6.     for j in range(2,k):
  7.         
  8.         s=k//j
  9.         y=k%j
  10.         if y!=0:
  11.             
  12.             a.append([j,s,y])
  13.             #print(a)
  14.             a[b].sort()
  15.             #print(a[b])
  16.             if a[b][2]/a[b][1]==a[b][1]/a[b][0]:
  17.                 d.append(k)
  18.             b+=1

  19. d=list(set(d))
  20. print(d)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-5 12:46:26 | 显示全部楼层
想想怎么优化
  1. def sh():
  2.     n = 1
  3.     while True:
  4.         yield n**2
  5.         if n**2 >=100000000:
  6.             break
  7.         n += 1

  8. def x():
  9.     count = 0
  10.     for i in sh():
  11.         for j in range(2,int(i)//2+1):
  12.             t = i%j
  13.             t1 = i//j
  14.             t2 = j
  15.             if (t*t1 == t2**2 or t*t2 ==t1**2 or t1*t2 ==t**2):
  16.                 count += i
  17.                 break
  18.     print('')
  19.     print(count)

  20. x()
  21.         
复制代码

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

使用道具 举报

发表于 2018-2-5 13:51:02 | 显示全部楼层
本帖最后由 JAY饭 于 2018-2-5 15:43 编辑

算了,是错的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-5 17:37:11 | 显示全部楼层

正向算走不通,就试试反向算
  1. res = 0
  2. for q in range(10000):
  3.         for r in range(1,q):
  4.                 n = q**3/r+r
  5.                 if n%1 !=0: continue
  6.                 if (n**0.5)%1!=0: continue
  7.                 if n<10**8: res += n
  8. print(res)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-5 19:48:29 | 显示全部楼层
我想到过这一种解法,但怎么都缕不清
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-5 20:14:05 | 显示全部楼层
jerryxjr1220 发表于 2018-2-5 17:37
正向算走不通,就试试反向算

我的疑惑是 n = q**3/r +r,  我先理解q肯定是除数,r肯定要比q小,这个好理解,但是
商是(q*q/r)中,是否漏掉了一种可能,这里只涉及q和r直接成连续比,但如果商数是等比数中,
中间的那个,因为题目说, 序数不固定。   那是否  商  可以写成这样 math.sqrt(q*r)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-5 21:13:07 | 显示全部楼层
看着法制节目,我改了下迭代,先睡觉,明天继续
  1. import math
  2. res = 0
  3. for q in range(10000):
  4.         for r in range(1,q):
  5.                 n = q**3/r+r
  6.                 print(n)
  7.    
  8.                 n = q*math.sqrt(q*r)+r
  9.                 print(n)
  10.                
  11.                 n = q*(r*( r/q)) +r
  12.                 print(n)
  13.                
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-5 21:20:44 | 显示全部楼层
因为按大神你之前的写法,我打印100以下的所有渐进数,暂不算平方,结果漏掉了 20 ,因为20应该是渐进数
20 / 8 ,2 ,4. 所以我改写了下。。。可能是我题目理解有误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-6 09:06:51 | 显示全部楼层
我终于知道你为什么这么写了
第二种情况,我试了一下,输出为0 。
  1. res = 0
  2. for q in range(1,10000):
  3.         for r in range(1,q):
  4.                 #因为余数r无论如何要小于除数,所以等比数列中r总比q小
  5.                 #1,先假设除数q小于商数,所以商数q可以表示为q*(q/r),商数不断增大
  6.                 #2,假设除数大于商数,此时再假设商数也大于余数,发现
  7.                 #这个时候,这个等式和上面的等式其实是一种方式,
  8.                 #所以这两者等式就是一个等式
  9.                 n = q**3/r+r
  10.                 if (n**0.5)%1 ==0 and n<100000000:
  11.                         res += n
  12.                         print(n)

  13. for q in range(1,10000):
  14.         for r in range(q+1,10000):
  15.                 #这里假设的第二种情况,商数小于余数,除数此时最大
  16.                 #等式表示为 n =q*(r*r/q)+r,简化如下
  17.                 n = r*r + r
  18.                 if (n**0.5)%1 ==0 and n<100000000:
  19.                         res += n
  20.                         print(n)
  21. print(res)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-6 17:18:03 | 显示全部楼层
JAY饭 发表于 2018-2-6 09:06
我终于知道你为什么这么写了
第二种情况,我试了一下,输出为0 。

“除数,商,余数”为等比数列组成的数 和 “商,除数,余数”为等比数列组成的数 不是一回事么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-6 19:56:03 | 显示全部楼层
jerryxjr1220 发表于 2018-2-6 17:18
“除数,商,余数”为等比数列组成的数 和 “商,除数,余数”为等比数列组成的数 不是一回事么?{:10_25 ...

之前没绕出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-13 11:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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