求大佬指点!

P1045 [NOIP2003 普及组] 麦森数

CaptainRX @ 2020-07-28 17:18:14

n=int(input())
m=(2**n)-1
a=0
list1=[]
while m!=0:
    a+=1
    list1.insert(0,m%10)
    m=m//10
b=len(list1)
if b<500:
    for i in range(500-b):
        list1.insert(0,0)
print(a)
for i in range(len(list1)):
    print(list1[i],end='')
    if (i+1)%50==0:
        print(end='\n')

初学python,请大佬指点,十分感谢!


by garethhkm2023 @ 2020-07-28 18:56:06

很多问题欸 :/

首先尽管python(pypy3)是万能的,2**n在n太大的时候还是会超时,n=3e6没可能,先不管

while m!=0:
    a+=1
    list1.insert(0,m%10)
    m=m//10

呃 list.insert 是 O(n)的

while m != 0:
    a += 1
    list1.append(m % 10) # O(1)
list1.reverse() # O(n)
b=len(list1)
if b<500:
    for i in range(500-b):
        list1.insert(0,0)

如果b>500,range(负数)是空的 = nop,所以不用判断b<500

#上面先不要reverse
b=len(list1)
for i in range(500-b):
    list1.append(0) # 同上
list1.reverse()

下面没有问题,不过我的写法不同,可以参考一下(?)

from math import floor, log# 位数
n = int(input())
print (floor(n * log(2, 10))+1)
# 求(2^n-1) % 10**500
# 可以用pow(2,n,10**500)-1 这可不会TLE 因为不用(太)高精
m = pow(2, n, 10 ** 500) - 1
# mofa
m = str(m).zfill(500)
for i in range(10):
    print (m[i*50:i*50+50])

python大法好


by CaptainRX @ 2020-07-28 19:17:10

非常感谢


by CaptainRX @ 2020-07-28 19:44:30

@garethhkm2023 非常感谢,但是按照大佬你的指点修改了一下还是四个超时,四个错误,不是很明白


by garethhkm2023 @ 2020-07-28 19:48:10

代码


by garethhkm2023 @ 2020-07-28 20:03:03

首先尽管python(pypy3)是万能的,2**n在n太大的时候还是会超时,n=3e6没可能,先不管

对不起我字体用了小了 OwO

把m=2**n-1改成print(n*log(2,10))

如无意外是必须的


by CaptainRX @ 2020-07-28 20:46:05

n=int(input())
m=pow(2,n)
a=0
list1=[]
while m!=0:
    a+=1
    list1.append(m%10)
    m=m//10
b=len(list1)
for i in range(500-b):
    list1.append(0)
list1.reverse()
print(a)
for i in range(len(list1)):
    print(list1[i],end='')
    if (i+1)%50==0:
        print(end='\n')

@garethhkm2023

把m=2*n-1改成print(nlog(2,10))?

2**n太大数据会超我知道了,但其他的能否解释的再详细一点 QAQ


by garethhkm2023 @ 2020-07-29 11:12:20

对不起昨天没看到

就是把位数那一部分改成n*log(2,10) 原因如下

2^n = 10^(n*log_2(10)) 当中对数的基数是10 对吧

而10^x的位数为floor(x)+1 (看看例子就可以10^2.5什么的)

所以2^n位数为floor(n*log_2(10))+1

python写法是

from math import floor,log # 不要import * 否则你没有了pow
floor(n*log(2,10))+1

@CaptainRX


by garethhkm2023 @ 2020-07-29 11:13:14

啊还有可以这样写

from math import log10
floor(n*log10(2))+1

by CaptainRX @ 2020-07-29 14:35:14

@garethhkm2023 非常感谢


|