鱼C论坛

 找回密码
 立即注册
查看: 8672|回复: 121

[已解决]Python:每日一题 355

[复制链接]
发表于 2020-3-19 17:51:48 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zltzlt 于 2020-3-19 17:55 编辑

今天的题目:


给定一个非负整数 c,判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。

示例 1:

输入:5
输出:True
解释:1 * 1 + 2 * 2 = 5
示例 2:

输入:3
输出:False


欢迎大家一起答题!
最佳答案
2020-3-19 21:47:36
  1. import math as m
  2. def f355(integer):
  3.     sqrt = m.sqrt(integer)
  4.     sqrt_int = int(sqrt)
  5.     if sqrt % 1:
  6.         low_lim = int(m.sqrt(integer/2))
  7.         for i in reversed(range(low_lim,sqrt_int+1)):
  8.             rem = m.sqrt(integer - i*i)
  9.             if rem % 1:
  10.                 continue
  11.             else:
  12.                 return True
  13.         else:
  14.             return False
  15.     else:
  16.         return True
复制代码

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-3-19 17:57:22 | 显示全部楼层
本帖最后由 qiuyouzhi 于 2020-3-19 18:07 编辑
  1. def f355(n):
  2.     for i in range(n+1):
  3.         for j in range(n+1):
  4.             if pow(i,2) + pow(j,2) == n:
  5.                 return True
  6.     return False

  7. print(f355(8))
复制代码

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

使用道具 举报

 楼主| 发表于 2020-3-19 17:58:15 | 显示全部楼层
qiuyouzhi 发表于 2020-3-19 17:57
闲来无事先瞎写一个:

定会超时,待会再改改

输入 4 就有错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 17:59:23 | 显示全部楼层

!我滴妈
瞎写了一个居然。。。。
我去改改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 18:00:39 | 显示全部楼层
qiuyouzhi 发表于 2020-3-19 17:59
!我滴妈
瞎写了一个居然。。。。
我去改改

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

使用道具 举报

发表于 2020-3-19 18:01:21 | 显示全部楼层

能不能给几个测试用例,防止再次
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 18:02:45 | 显示全部楼层
  1. import math
  2. num = eval(input())

  3. flag=0
  4. for i in range(0,int(pow(num,1/2))+1):
  5.         for j in range(0,int(pow(num,1/2))+1):
  6.                 if pow(i,2)+pow(j,2)==num:
  7.                         flag = 1
  8.                         print("True")
  9.                         break
  10.         if flag==1:
  11.                 break
  12. if not flag:
  13.         print("False")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 18:03:20 | 显示全部楼层
qiuyouzhi 发表于 2020-3-19 18:01
能不能给几个测试用例,防止再次

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

使用道具 举报

 楼主| 发表于 2020-3-19 18:05:43 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 18:20:22 | 显示全部楼层
本帖最后由 TJBEST 于 2020-3-19 21:17 编辑
  1. import math
  2. def fun355(c):
  3.     def isSquare(num):#判断平方数
  4.         temp = math.floor((num**(1/2)))
  5.         if temp * temp != num:
  6.             return False
  7.         else:
  8.             return True
  9.     def isHuZhi(a,b):#判断互质 a > b
  10.         while b:
  11.             a,b = b,a%b
  12.         if a == 1:
  13.             return True
  14.         else:
  15.             return False
  16.     def findHuZhi(a):#a > 2寻找所有比a小的与a互质的数 返回列表
  17.         result = []
  18.         for index in range(1,a):
  19.             if isHuZhi(a,index):
  20.                 result.append(index)
  21.         return result
  22.    
  23.     if isSquare(c):
  24.         return True  
  25.     gate = math.floor(((c-1)**(1/2)))
  26.     for index in range(1,gate+1):
  27.         temp = 1 + index ** 2
  28.         if c % temp == 0 and isSquare(c//temp):
  29.             return True
  30.     other = (-1+(2*c-1)**(1/2))/2
  31.     gate = math.floor(other)
  32.     for index in range(2,gate+1):
  33.         HuZhiArr = findHuZhi(index)
  34.         for each in HuZhiArr:
  35.             other = (-each + (c-index)**(1/2))/index
  36.             innergate = math.floor(other)
  37.             for k in range(1,innergate+1):
  38.                 innerNum = k * index + each
  39.                 temp = (innerNum**2)+(index**2)
  40.                 if c % temp == 0 and isSquare(c//temp):
  41.                     return True
  42.     return False
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-19 18:35:17 | 显示全部楼层
这两个整数可以相同是吧,8的话是不是2**2+2**2这样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 18:37:57 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-3-19 19:12 编辑

我的代码:
  1. from math import sqrt,ceil

  2. class Solution:
  3.     def judgeSquareSum(self, c: int) -> bool:
  4.         if not sqrt(c)%1:
  5.             return True
  6.         for i in range(1,ceil(sqrt(c))):
  7.             if not sqrt(c-i*i)%1:
  8.                 return True
  9.         return False
复制代码


力扣大神解法:(128ms)
  1. from math import sqrt,floor

  2. class Solution:
  3.     def judgeSquareSum(self, c):
  4.         left=0
  5.         right=floor(sqrt(c))

  6.         while left<=right:
  7.             total=left*left+right*right
  8.             
  9.             if total>c:
  10.                 right-=1
  11.             elif total<c:
  12.                 left+=1
  13.             else:
  14.                 return True

  15.         return False
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

发表于 2020-3-19 18:44:30 | 显示全部楼层
  1. import math
  2. def func(c):
  3.     for a in range(c+1):
  4.         for b in range(c+1):
  5.            if math.pow(a, 2) + math.pow(b, 2) == c:
  6.                return True
  7.     return False
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-19 18:45:00 | 显示全部楼层

1 = 0**2 + 1**2
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 18:50:05 | 显示全部楼层
本帖最后由 kinkon 于 2020-3-20 08:46 编辑

双针法
  1. def fun355(c):
  2.     r = int(c**0.5)
  3.     if c - r <= 1:
  4.         return True
  5.     l = int((c - r*r)**0.5)
  6.     for i in range(l, r+1):
  7.         num = i*i + r*r           
  8.         if num == c:
  9.             return True
  10.         elif num > c:
  11.             r -= 1
  12.     return False
复制代码


如果上面不对,试试下面的
  1. def p355(c):
  2.     m = int(c**0.5)
  3.     if c - m <= 1:
  4.         return True
  5.     while m:   
  6.         if c == int((c - m*m)**0.5)**2 + m*m:
  7.             return True
  8.         m -= 1
  9.     return False
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

发表于 2020-3-19 18:51:47 | 显示全部楼层
  1. def fun355(c):
  2.     for i in range(int(c**0.5)+1):
  3.         if not (c-i**2)**0.5%1:
  4.             return True
  5.     return False
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

发表于 2020-3-19 18:54:14 | 显示全部楼层

输入8就错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 18:55:58 | 显示全部楼层

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

使用道具 举报

发表于 2020-3-19 18:57:27 | 显示全部楼层

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

使用道具 举报

发表于 2020-3-19 18:58:55 | 显示全部楼层
本帖最后由 mdphd 于 2020-3-19 19:53 编辑
  1. import math
  2. def f355(x):
  3.     a = int(math.sqrt(x / 2))
  4.     def f(m, n):
  5.         i = m
  6.         c = 0
  7.         while i <= a:
  8.             if int(math.sqrt(x - i ** 2)) != math.sqrt(x - i ** 2):
  9.                 i += n
  10.             else:
  11.                 print('True')
  12.                 c = 1
  13.                 break
  14.         if c == 0:
  15.             print("False")
  16.     if x % 4 == 0:
  17.         f(0, 2)
  18.     if x % 4 == 1:
  19.         f(0, 1)
  20.     if x % 4 == 2:
  21.         f(1, 2)
  22.     if x % 4 == 3:
  23.         print("False")
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-11 16:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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