William4869 发表于 2020-2-4 19:57:35

William4869 发表于 2020-2-4 19:56
def f323(s):
    lenth=len(s)//2+1
    for i in range(1,lenth):


多了几个print.....

William4869 发表于 2020-2-4 19:58:26

def f323(s):
    lenth=len(s)//2+1
    for i in range(1,lenth):
      s0=s[:i]
      for j in range(1,lenth):
            s1=s
            news=s
            sum=0
            while len(news)>=len(str(int(s0)+int(s1)))and news[:len(str(int(s0)+int(s1)))]==str(int(s0)+int(s1)):
                news=news
                s0,s1=s1,str(int(s0)+int(s1))
                sum+=1
            if len(news)==0 and sum>0:
                return True
    return False
print(f323("000"))

William4869 发表于 2020-2-4 20:04:40

本帖最后由 William4869 于 2020-2-5 18:18 编辑

def f323(s):
    lenth=len(s)//2+1
    for i in range(1,lenth):
      for j in range(1,len(s)//3*2-lenth+10):
            s0=s[:i]
            s1=s
            news=s
            sum=0
            while len(news)>=len(str(int(s0)+int(s1)))and news[:len(str(int(s0)+int(s1)))]==str(int(s0)+int(s1)):
                if (len(s0)>1 and s0=='0')or (len(s1)>1 and s1=='0'):
                  break
                news=news
                s0,s1=s1,str(int(s0)+int(s1))
                sum+=1
            if len(news)==0 and sum>0:
                return True
    return False
print(f323("111122335588"))



阴阳神万物主 发表于 2020-2-4 20:32:07

本帖最后由 阴阳神万物主 于 2020-2-4 20:33 编辑

101应该也算对吧?
0 不就是以 0 开头的吗?

阴阳神万物主 发表于 2020-2-4 21:00:23

本帖最后由 阴阳神万物主 于 2020-2-4 21:07 编辑

从格式上与他人做区别。
def solve(s:'str of int')->bool:
    def num(a,b):
      while True:
            yield a+b
            a,b = b,a+b
    le = len(s)
    for l in range(1,(le//2)+1):
      for r in range(1,le-l):
            if r>1 and s == '0':
                break
            n = iter(num(int(s[:l]),int(s)))
            get = s[:l+r]
            t = 2
            while len(get)<=le:
                if get == s and t>=3:
                  return True
                get += str(next(n))
                t += 1
    return False
if __name__ == '__main__':
    print('示例1 输出:',solve('112358'))
    print('示例2 输出:',solve('199100199'))
    print('别人错的 11#',solve('1023'))
没有更改,减少一下行数。
def solve(s:'str of int')->bool:
    def num(a,b):
      while True:
            yield a+b
            a,b = b,a+b
    le = len(s)
    for l in range(1,(le//2)+1):
      for r in range(1,le-l):
            if r>1 and s == '0':break
            n, get, t = iter(num(int(s[:l]),int(s))), s[:l+r], 2
            while len(get)<=le:
                if get == s and t>=3:return True
                get += str(next(n))
                t += 1
    return False
if __name__ == '__main__':
    print('示例1 输出:',solve('112358'))
    print('示例2 输出:',solve('199100199'))
    print('别人错的 11#',solve('1023'))



Vmtayvj 发表于 2020-2-4 22:03:58

前几次的出题学到itertools.combinations
感觉这就可以用上,但我绞尽脑汁都想不出来...

TJBEST 发表于 2020-2-4 22:23:57

本帖最后由 TJBEST 于 2020-2-4 22:26 编辑

可能有点繁琐,但是结果应该没错
def fun323(string):
    M = len(string)
    if M < 3:
      return False
    else:
      for u0 in range(1,(M//3)+1):
            for u1 in range(u0,((M - u0)//2)+1):
                num1 = string
                num2 = string
                if (len(num1) > 1 and num1=='0') or (len(num2) > 1 and num2=='0'):
                  pass
                else:
                  num1 = int(string)
                  num2 = int(string)
                  index = u0 + u1
                  while index < M:
                        temp = num1 + num2
                        bits = len(str(temp))
                        new = index + bits
                        if new < M:
                            if str(temp) == string:
                              num1 = num2
                              num2 = int(string)
                              index = new
                            else:
                              break
                        elif new == M:
                            if str(temp) == string:
                              return True
                            else:
                              break
                        else:
                            break
                           
                num1 = string
                num2 = string
                if (len(num1) > 1 and num1=='0') or (len(num2) > 1 and num2=='0'):
                  pass
                else:
                  num1 = int(string)
                  num2 = int(string)
                  index = u0 + u1
                  while index < M:
                        temp = num1 + num2
                        bits = len(str(temp))
                        new = index + bits
                        if new < M:
                            if str(temp) == string:
                              num1 = num2
                              num2 = int(string)
                              index = new
                            else:
                              break
                        elif new == M:
                            if str(temp) == string:
                              return True
                            else:
                              break
                        else:
                            break
    return False

546623863 发表于 2020-2-4 22:27:27

def fun323(num):
    length = len(num)
    if length < 3:
      return False
    for i in range((length-1)//2):
      if num == '0' and i >= 1:
                continue
      for j in range(i+1,length//2):
            if num == '0' and j != i+1:
                continue
            a = int(num[:i+1])
            b = int(num)
            nextindex = j+1
            nextc = a+b
            lenitem = len(str(nextc))
            while nextindex < length and nextindex+lenitem <= length and int(num) == nextc:
                a = b
                b = int(num)
                nextc = a+b
                nextindex += lenitem
                lenitem = len(str(nextc))
            if nextindex == length:
                return True
    return False

print(fun323("11199911102109"))

顺便帮我把前面两次的评了。。。

fan1993423 发表于 2020-2-4 22:41:52

好吧,我想了个比较奇特的方法
def fun323(s):
    if len(s)<3:return False
    def recursive(a,s,j):
      b,c=s,s
      t=str(int(a)+int(b))
      if c==t:
            return True
      elif c.startswith(t):
            return recursive(b,' '*i+c,len(t))
      else:
            return False
    for i in range(1,len(s)-1):
      for j in range(1,(len(s)-i)//2+1):
            a=s[:i]
            if recursive(a,s,j):return True
    return False

kinkon 发表于 2020-2-5 01:19:57

本帖最后由 kinkon 于 2020-2-5 02:51 编辑

学习阶段,参考大神们的
def f323(s):
    l=len(s)
    if l<3:return False
    for i in range(1,l//3+1):
      for j in range(i,l//2+1):
            c=i+j
            a,b=int(s),int(s[:i])+int(s)
            while str(b)==s:
                c+=len(str(b))
                if c==l:return True
                a,b=b,a+b
    return False
   
print(f323('0112358'))
print(f323('199100199'))
print(f323('112359'))
print(f323('199100198'))
print(f323('101'))

kinkon 发表于 2020-2-5 03:04:13

1001101算True还是False?

zltzlt 发表于 2020-2-5 13:37:16

su沐沫 发表于 2020-2-4 18:55
累加数可以干嘛用呢

??

zltzlt 发表于 2020-2-5 13:39:43

Croper 发表于 2020-2-4 19:31


36 ms

zltzlt 发表于 2020-2-5 13:51:42

ll104567 发表于 2020-2-4 19:36
暴力战胜一切-----------------------------------------------------

解答错误

输入:"10"
输出:True
预期结果:False

zltzlt 发表于 2020-2-5 13:52:48

William4869 发表于 2020-2-4 19:56
def f323(s):
    lenth=len(s)//2+1
    for i in range(1,lenth):


解答错误

输入:"1023"
输出:True
打印:1 0
预期结果:False

ll104567 发表于 2020-2-5 14:12:56

增加了一个判断,测试用例多给几个吧~

def gene(a,b):
    x =
    for i in range(100):
      x.append(str(int(x[-1])+int(x[-2])))
    return ''.join(x)

def create_list(n):
    if n % 3 == 1:
      max_number = (n+1)//3 + 1
    elif n %3 == 2:
      max_number = (n+2)//3 + 1
    else:
      max_number = (n)//3 + 1
    x = []
    for i in range(1,max_number):
      for j in range(i,max_number):
            x.append((i,j))
    #print(x)
    return x

def check(x):
    if len(x) < 3:
      return False
    l = create_list(len(x))
    all_possible = []
    for i in l:
      a = int(x])
      b = int(x:i+i])
      all_possible.append(gene(a,b))
    for i in all_possible:
      #print(i[:20])
      if i.startswith(x):
            return True
    return False

print(check('10'))
print(check('199100199'))
print(check('112359'))
print(check('199100198'))

William4869 发表于 2020-2-5 15:06:08

zltzlt 发表于 2020-2-5 13:52
解答错误

输入:"1023"


改了

zltzlt 发表于 2020-2-5 16:34:25

Vmtayvj 发表于 2020-2-4 22:03
前几次的出题学到itertools.combinations
感觉这就可以用上,但我绞尽脑汁都想不出来...

combinations 效率很低,如果用 combinations 八成会超时。

zltzlt 发表于 2020-2-5 16:35:20

William4869 发表于 2020-2-4 20:04
def f323(s):
    lenth=len(s)//2+1
    for i in range(1,lenth):


如何正确发代码:https://fishc.com.cn/forum.php?mod=viewthread&tid=52272

zltzlt 发表于 2020-2-5 16:36:24

William4869 发表于 2020-2-4 20:04
def f323(s):
    lenth=len(s)//2+1
    for i in range(1,lenth):


解答错误

输入:"198019823962"
输出:False
预期结果:True
页: 1 [2] 3 4 5
查看完整版本: Python:每日一题 323