Python刷题

PythonTip-挑战Python

(以下代码是在PyCharm上运行成功的,如果想要在刷题上成功运行,需要把前边的定义去掉)

34.题目描述:

生活在当代社会,我们要记住很多密码,银行卡,qq,人人,微博,邮箱等等。小P经过一番思索之后,发明了下面这种生成密码方法:给定两个正整数a和b, 利用a / b我们会得到一个长度无限的小数(若a / b不是无限小数,比如1/2=0.5,我们认为0.5是0.5000000...,同样将其看做无限长的小数),小P将该小数点后第x位到第y位的数字当做密码,这样,无论密码有多长,小P只要记住a,b,x,y四个数字就可以了,牢记密码再也不是那么困难的事情了。现在告诉你a,b,x,y(0 < a,b <= 20132013, 0 < x <= y < 100000000000),请你输出密码。例如:a = 1, b = 2, x = 1, y = 4, 则 a / b = 0.5000000..., 输出小数点后第1到4位数字,即5000

会了之后感觉这道题还挺容易的吗,不知道为什么那两天觉得这道题好难,丝毫没有头绪,但是其实就是除法和取余的运算,我们想要小数点后x位到y位的数值,但是普通方法比较难取得小数点后几位的内容,如果把这部分内容放到整数部分就比较好算了,当然也不能直接全部放到整数部分,这样如果y的值比较大的时候会使得一次性的运算量比较大,应该逐步运行,具体的做法是:首先将小数点后移x-1位,使得小数点后第一位就是x,第y-x+1就是第y位,接着将此式得到的值对b取余,此时这个数是一定小于b接着就开始第x位的内容了,先将取余得到的数乘10在对b做除法即为我们想要的x位,接着为了得到下一位就先更新数为上次所得数乘以10的b取余,此时这个数是一定小于b接着就开始第x位的内容了,先将取余得到的数乘10在对b做除法即为我们想要的x+1位,以此循环直到y-x+1位全部输出。

注意刚开始用到公式

(a*10^(x-1))%b = ((a%b)*(10^(x-1)%b))%b
a = 1
b = 2
x = 1
y = 4
num = (a%b*pow(10,x-1,b))%b
str1 = ''
while len(str1) < y-x+1:
    str1 = str1+str(int(num *10/b))
    num =num*10%b
print(str1)

35.题目描述:

给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个连续子序列,使其和最大,输出最大子序列的和。 例如,对于L=[2,-3,3,50], 输出53(分析:很明显,该列表最大连续子序列为[3,50]).

num = L[0]
he = 0
for i in range(0,len(L),1):
   he = he + L[i]
   num = max(he,num)
   he = max(he, 0)
print(num)

(我认为本题值得思考的地方是并不是遇见符号就要重新开始,而是前边之和加起来小于0了才需要重新开始计算)

36.题目描述:

给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和。 这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻。 例如,对于L=[2,-3,3,50], 输出52(分析:很明显,该列表最大非连续子序列为[2,50]).

(感觉后边的题出现了一些难度,也是我过于菜了,哈哈哈哈哈哈)

(这个题对我来说没有一下子就想清楚的方法,也是看了别人写的,弄了两个方法)

方法一:就是简单的推导,把当前列表的值,和前一个值以及当前值加上前前一个值进行比较,选择大的存起来(注意:前一个值和前前一个数值都是之前比较中选出来的不连续的值)

L = [2,-3,3,50]
L_max = [0] * len(L)
if len(L) <= 2:
    print(max(L))
else:
    L_max[0] = L[0]
    L_max[1] = max(L[0], L[1])
    for i in range(2, len(L)):
        # 对L_max[i]的赋值为,以下三项中最大的一项:L_max[i - 1], L[i] + L_max[i - 2], L[i]
        L_max[i] = max(L_max[i - 1], L[i] + L_max[i - 2], L[i])
    print(L_max[-1])
    print(L_max)


方法二:使用的公式动态规划的解题思路,寻找最优子问题,最优值为当前值或者当前值加上上一个最优值,有递推公式:L[i] = max(max(L[0:i-1],0))+L[i] i>=2


L=[2,-3,3,50]
for i in range(2, len(L)):
    L[i] = max(max(L[0:i - 1]), 0) + L[i]    #列表左闭右开
    #L[i] = max(max(L[0:i - 1]), 0) + L[i]
print(max(L))