William4869 发表于 2020-2-4 19:56
def f323(s):
lenth=len(s)//2+1
for i in range(1,lenth):
多了几个print.....
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-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:33 编辑
101应该也算对吧?
0 不就是以 0 开头的吗?
本帖最后由 阴阳神万物主 于 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'))
前几次的出题学到itertools.combinations
感觉这就可以用上,但我绞尽脑汁都想不出来...
本帖最后由 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
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"))
顺便帮我把前面两次的评了。。。
好吧,我想了个比较奇特的方法
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 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'))
1001101算True还是False?
su沐沫 发表于 2020-2-4 18:55
累加数可以干嘛用呢
??
Croper 发表于 2020-2-4 19:31
36 ms
ll104567 发表于 2020-2-4 19:36
暴力战胜一切-----------------------------------------------------
解答错误
输入:"10"
输出:True
预期结果:False
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
增加了一个判断,测试用例多给几个吧~
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'))
zltzlt 发表于 2020-2-5 13:52
解答错误
输入:"1023"
改了
Vmtayvj 发表于 2020-2-4 22:03
前几次的出题学到itertools.combinations
感觉这就可以用上,但我绞尽脑汁都想不出来...
combinations 效率很低,如果用 combinations 八成会超时。
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
William4869 发表于 2020-2-4 20:04
def f323(s):
lenth=len(s)//2+1
for i in range(1,lenth):
解答错误
输入:"198019823962"
输出:False
预期结果:True