鱼C论坛

 找回密码
 立即注册
查看: 789|回复: 3

[已解决]设计一个函数,半径为R的大圆内放置半径为1的小圆,计算小圆的数量

[复制链接]
发表于 2019-3-28 13:57:01 | 显示全部楼层 |阅读模式

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

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

x
条件:1,大圆的半径可以是任意正数。不论浮点和整形
          2,小圆与大圆最多相切,不可以交叉、干涉
          3,小圆与小圆同样最多只能相切,不可以交叉,干涉
          4 ,小圆半径为1
          5,要求在任意大于0的大圆半径r的情况下有效,与实际相符(哪怕在1<r<4.1的范围内)
难点:问题没有想象中的简单,关键在于堆叠排列小圆的方法,以及边界的限定问题。

最佳答案
2019-3-31 23:00:24
本帖最后由 syf040916 于 2019-4-1 23:00 编辑

  1. def Dcd(D,d):
  2.         sum=1
  3.         n=int((D/2-d/2)//d)
  4.         sum_res=0
  5.         lift=d*3**0.5/2
  6.         h=n*d*3**0.5/2
  7.         for i in range(n):sum+=6*(i+1)
  8.         if n%2==0:
  9.                 for j in range(int(n/2)):
  10.                         r=(2*j+1)*d/2
  11.                         if (r**2+(h+lift)**2)**0.5+d/2<=D/2:sum_res+=2
  12.                         else:break
  13.         else:
  14.                 for k in range(int((n+1)/2)):
  15.                         r=k*d
  16.                         if r==0:
  17.                                 if (r**2+(h+lift)**2)**0.5+d/2<=D/2:
  18.                                         sum_res+=1
  19.                                 else:break
  20.                         else:
  21.                                 if (r**2+(h+lift)**2)**0.5+d/2<=D/2:
  22.                                         sum_res+=2
  23.                                 else:break
  24.         return sum+sum_res*6
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-31 23:00:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 syf040916 于 2019-4-1 23:00 编辑

  1. def Dcd(D,d):
  2.         sum=1
  3.         n=int((D/2-d/2)//d)
  4.         sum_res=0
  5.         lift=d*3**0.5/2
  6.         h=n*d*3**0.5/2
  7.         for i in range(n):sum+=6*(i+1)
  8.         if n%2==0:
  9.                 for j in range(int(n/2)):
  10.                         r=(2*j+1)*d/2
  11.                         if (r**2+(h+lift)**2)**0.5+d/2<=D/2:sum_res+=2
  12.                         else:break
  13.         else:
  14.                 for k in range(int((n+1)/2)):
  15.                         r=k*d
  16.                         if r==0:
  17.                                 if (r**2+(h+lift)**2)**0.5+d/2<=D/2:
  18.                                         sum_res+=1
  19.                                 else:break
  20.                         else:
  21.                                 if (r**2+(h+lift)**2)**0.5+d/2<=D/2:
  22.                                         sum_res+=2
  23.                                 else:break
  24.         return sum+sum_res*6
复制代码
WeChat Screenshot_20190331225812.png

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
Stubborn + 2 + 2 + 2

查看全部评分

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

使用道具 举报

发表于 2019-3-31 23:42:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-1 20:16:24 | 显示全部楼层
本帖最后由 syf040916 于 2019-4-1 22:59 编辑

重新更新了一下算法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 22:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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