鱼C论坛

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

[已解决]讨论两段代码的区别

[复制链接]
发表于 2018-5-13 02:04:09 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 程序员的救赎 于 2018-5-13 02:08 编辑

这是codewars上的一道基础题,题目很简单,就是判断一个数如果是平方数就返回True ,否则返回False(另外:若为0返回True,若是负数返回False)
(下面是原题目,看不懂可以直接跳过)
Task

Given an integral number, determine if it's a square number:

In mathematics, a square number or perfect square is an integer that is the square of an integer; in other words, it is the product of some integer with itself.
The tests will always use some integral number, so don't worry about that in dynamic typed languages.

Examples

is_square (-1) # => false
is_square   0 # => true
is_square   3 # => false
is_square   4 # => true
is_square  25 # => true
is_square  26 # => false


#我的正确解法

  1. from math  import sqrt
  2. def is_square(n):
  3.     if n < 0:
  4.         return False
  5.     elif n == 0:
  6.         return True
  7.         
  8.     return True if int(sqrt(n)) == sqrt(n) else False
复制代码

#问题来了,最后一句我改为 return True if n ==  sqrt(n)**2 else False,结果是有一部分测试用例不能通过的。初步想法是n的取值过大造成的,但是没办法证明,鱼油们有想法可以和我交流交流。
最佳答案
2018-5-13 11:43:06
问题来了,n过大,不是平方数的也可能被你第一个代码判断是平方数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-5-13 10:48:09 | 显示全部楼层
哪部份不能通过?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 11:11:23 | 显示全部楼层
带小数点的过不了吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 11:43:06 | 显示全部楼层    本楼为最佳答案   
问题来了,n过大,不是平方数的也可能被你第一个代码判断是平方数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 12:44:57 | 显示全部楼层
长生木 发表于 2018-5-13 11:11
带小数点的过不了吧?

不是,就是一个很大的整数不能通过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 12:45:50 | 显示全部楼层
ba21 发表于 2018-5-13 10:48
哪部份不能通过?

当n是一个很大的整数(十位数)时,判断会出错(上面的只是部分测试用例)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 12:48:23 | 显示全部楼层
塔利班 发表于 2018-5-13 11:43
问题来了,n过大,不是平方数的也可能被你第一个代码判断是平方数

我的第一个代码是运行通过的,换成return True if n ==  sqrt(n)**2 else False就错了,为什么n过大会判断成平方数?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 15:11:30 | 显示全部楼层
程序员的救赎 发表于 2018-5-13 12:48
我的第一个代码是运行通过的,换成return True if n ==  sqrt(n)**2 else False就错了,为什么n过大会判 ...


n数字大了以后开方会转换格式,都是a×e多少次幂(被四舍五入),n-1和n的开方就没了区别

因此你的代码2也一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 16:55:42 | 显示全部楼层
本帖最后由 程序员的救赎 于 2018-5-13 17:13 编辑

c27dc7e31b663c5804dda24b164e464.png   

问题应该不是开方而是小数的平方
不懂,为什么开方后再平方会比原来的大。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 17:03:56 | 显示全部楼层
呵呵,你n没有取得足够大
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 17:19:32 | 显示全部楼层
塔利班 发表于 2018-5-13 17:03
呵呵,你n没有取得足够大

你这个已经超过位数了,截断很正常啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-13 17:24:10 | 显示全部楼层
程序员的救赎 发表于 2018-5-13 17:19
你这个已经超过位数了,截断很正常啊

恩,但是你也没说超多少位啊,至于开方四舍五入得出平方大,还用说么,,不是一回事
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-13 17:38:25 | 显示全部楼层
塔利班 发表于 2018-5-13 17:24
恩,但是你也没说超多少位啊,至于开方四舍五入得出平方大,还用说么,,不是一回事

重要的一个点就是,你所说的sqrt的问题是其函数本身的缺陷,忽略这一点,我的代码2是对的,说明代码1的错误不在于sqrt函数,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-11 13:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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