ooxx7788 发表于 2017-6-3 17:31:13

Python: 每日一题 58

本帖最后由 ooxx7788 于 2017-6-4 12:41 编辑

根据给定的数字(n)返回一个升序的数组,数组中的值的平方和等于给定数(n)的平方。
当有多个组合时,返回倒序数字最大的那一组数组。

是不是看文字有点难懂呢?看例子:
decompose(11)    --->       11**2 = sum(map(lambda x:x**2,))   
                                              虽然也满足条件,但是因为9小于10,所以不是结果

再看一个列子:
decompose(50)--->
当然,也是不能做为答案的(这就不要算了),也是不可以的。如果没有合适的结果,那么就返回None。


**** Hidden Message *****

jerryxjr1220 发表于 2017-6-3 22:18:07

def decompose(n):
        results = []
        maxi = n-1
        queue = [ for i in range(2,n)]
        while queue:
                q = queue.pop()
                if results and max(q) < maxi:
                        return results[-1]
                for i in range(min(q)-1,0,-1):
                        if sum(map(lambda x:x*x,q)) + i*i == n*n and i not in q:
                                results.append(sorted(q + ))
                                maxi = max(q)
                        elif sum(map(lambda x:x*x,q)) + i*i < n*n and i not in q:
                                queue.append(q+)
        else:
                return None
       
print(decompose(50))


A*搜索算法,不过好像效率不是很高,尤其当n比较大的时候

ooxx7788 发表于 2017-6-3 23:00:59

本帖最后由 ooxx7788 于 2017-6-3 23:03 编辑

jerryxjr1220 发表于 2017-6-3 22:18


A*搜索算法,不过好像效率不是很高,尤其当n比较大的时候

能算出结果来应该是没什么问题,但是这种列表型的题目,又是while又是for的,基本上遇到大列表就过不去了。
不过答案还是很不错的。

WelanceLee 发表于 2017-6-4 15:57:25

有点厉害~

badaoqingchen 发表于 2017-6-5 11:18:17

66666

瓦蓝 发表于 2017-6-6 09:59:19

xuexi yixia

小锟 发表于 2017-6-6 18:43:41

学习一下

花寺情僧 发表于 2017-6-6 19:47:45

looklook

哨子1122 发表于 2017-6-7 15:33:42

学习

哨子1122 发表于 2017-6-7 16:44:35

想知道这个while起到了什么作用,另外我运行你这个代码不会出现你上面说到的另外一组数据

ooxx7788 发表于 2017-6-7 17:30:41

哨子1122 发表于 2017-6-7 16:44
想知道这个while起到了什么作用,另外我运行你这个代码不会出现你上面说到的另外一组数据

def decompose(n):
    total = 0
    answer =
    while len(answer):
      print('***')
      temp = answer.pop()
      total += temp ** 2
      for i in range(temp - 1, 0, -1):
            if total - (i ** 2) >= 0:
                total -= i ** 2
                answer.append(i)
                print(answer, total)
                if total == 0:
                  return sorted(answer)
    return None


建议你把程序改成我这样的,然后运行一次50.
再仔细研究研究就懂了。

solomonxian 发表于 2017-7-20 19:14:28

看起来题目的意思是每个数字只能用一次吧
用了工具把组合都算出来,才发现原来分解方式多得很,基本上不会有None的情况
那算出所有组合反而慢了
import math
import itertools
# 用字典,itertools的组合工具
def decompose(n):
    dit = {i:i**2 for i in range(n+1)}
    m = n-1 # 极限最大值
    result = []
    while 1:
      x = dit - dit # 平方差
      left = int(math.sqrt((x))) # 最大剩余数
      if left>x or n<=1: # 过了之后就重复了,等于凑不出结果
            return None
      
      a = for i in range(left,0,-1)]
      for i in range(1,left): # 剩下的所有组合可能算出来与结果对比
            result.append()
            
            if list(filter(None,result))!=[]: # 不是空列表就表示有结果了
                result = +]
                return sorted(result)
      m -= 1 # 极限最大值向后移一位,排除一个数

咕咕鸡鸽鸽 发表于 2019-1-11 20:26:35

kakan

咕咕鸡鸽鸽 发表于 2019-1-11 20:29:36

求教。。。为什么我fun(50) 没得出最大数是 49   想不通
def fun57(num):
    sum1 = num ** 2
    list1 = list(x**2 for x in range(1,num))
    list1.reverse()
    length = len(list1)
    list2 = []
    while length:
      for each in range(length):      
            if sum1 >= list1:
                sum1 -= list1
                list2.append(int(list1**0.5))
            if sum1 == 0:
                get = True
                break
            elif list1 == 1 and sum1 !=0:
                get = False

      if get:
            return sorted(list2)
            
      list2 = []                           
      list1.remove(list1)
      length -= 1
      sum1 = num ** 2
   
      
print(fun57(11))
print(fun57(50))

Geoffreylee 发表于 2020-3-2 11:14:33

def decompose(num):
    global lst# 全局列表
    for i in range(num-1, 0, -1):
      lst.append(i)# 大往小遍历
      total = sum(map(lambda x: x ** 2, lst))# 求和
      if total == num**2:# 与num平方相等返回list
            return lst

      elif total < num ** 2:# 小于则继续递归
            decompose(i)

      else:
            lst.pop()# 大于则弹出
    else:
      return lst


lst = []
print(decompose(50000))

holiday_python 发表于 2020-6-14 11:43:34

study

19971023 发表于 2020-7-13 15:13:52

1

z2x2c8 发表于 2020-9-5 23:24:13

看看

nononoyes 发表于 2020-10-6 09:17:03

学习啦

wwwwwise 发表于 2021-5-17 21:02:09

1
页: [1]
查看完整版本: Python: 每日一题 58