python常见循环练习

作者: estate47 | 来源:发表于2019-01-19 17:39 被阅读1次

    练习python刷题时遇到了一些比较典型的题目,整理了以下10道题:
    第一题:求5的阶乘
    方法1,递归

    def jc(num):
        if num == 1:
            return 1
        else:
            return num*jc(num-1)
    print(jc(5))
    

    方法2:for遍历

    def func(num):
        sum = 1
        for i in range(1,num+1):
            sum*=i
        return sum
    func(5)
    print(func(5))
    

    方法3,lambda表达式
    lambda不能调用数组,如列表。
    这里需要借助一个函数去做,这个函数调用了lambda表达式作为参数,即需要使用高阶函数reduce,使用高阶函数,需要调用一个模块将阶乘改成函数形式进行调用functools

    from functools import reduce
    print(reduce(lambda x,y:x*y,range(1,6)))
    

    第二题:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

    if __name__ == '__main__':
        s = input('please input a string:\n')
        print ('the string has %d characters.' % len(s))
    
    def func(a):                           
        '求一个字符串的长度'
        len=0
        for i in a:
            len+=1
        return len
    if __name__=='__main__':            
    
        str_input=input('请输出一个字符串') 
        str_len=func(str_input)              #通过调用外部的函数func(a),并传递实际参数str_input,实现在main函数计算字符串长度。
        print("输入字符串长度:", str_len)
    

    第三题:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

    i = 0
    for x in range(1,5):
        for y in range(1,5):
            for z in range(1,5):
                    if (x!=y) and (y!=z) and (z!=x):
                        i += 1
                        if i%4:
                            print("%d%d%d" % (x, y, z), end=" | ")
                        else:
                            print("%d%d%d" % (x, y, z))
    print ("合计个数:",i)
    

    第四题:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?

    i = int(input('净利润:'))
    arr = [1000000,600000,400000,200000,100000,0]#分成6段提成
    rat = [0.01,0.015,0.03,0.05,0.075,0.1]#每段提成对应的税率
    r = 0
    for idx in range(0,6):#索引有6个数
        if i>arr[idx]:
            r+=(i-arr[idx])*rat[idx]
            # print (r)
            i=arr[idx]
    print (r)
    

    第五题:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

    if __name__=="__main__":
        x=1
        i=1
        while x!=0:
            x = int((i+100)**0.5)
            y = int((i+100+168)**0.5)
            if x*x==(100+i) and y*y==(100+168+i):
                print(i)
                x = 0
            i+=1
    

    第六题:水仙花数是指一个 n 位数(n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。
    例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
    解法一:用a,b,c拼凑一个三位数

    for a in range(1,10):
        for b in range(0,10):
            for c in range(0,10):
                s1 = a*100+b*10+c
                s2 = pow(a,3)+pow(b,3)+pow(c,3)
                if s1==s2:
                    print('水仙花:%d'%s1)
    

    解法二:直接定义i为水仙花数来求它的元素

    for i in range(100,1000):
        s = str(i)
        if int(s[0])**3+int(s[1])**3+int(s[2])**3==i:
            print('水仙花:',i)
    

    解法三:用divmod根据余数和商来求出三位数

    for n in range(100,1000):
        m = n
        sumValue = 0
        while(m>0):
            (m,r) = divmod(m,10)
            sumValue +=r**3
        if n ==sumValue:
            print('水仙花:',n)
    

    第七题:将一个正整数分解质因数,例如:输入90,打印出90=233*5

    import math
    number = int(input("Enter a number: "))
    list = []
    def getChildren(num):
        print('*' * 30)
        isZhishu = True
        i = 2
        square = int(math.sqrt(num)) + 1
        while i <= square:
            if num % i == 0:
                list.append(i)
                isZhishu = False
                getChildren(num / i)
                i += 1
                break
            i += 1
        if isZhishu:
            list.append(num)
    getChildren(number)
    print(list)
    

    第八题:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。

    if __name__ == '__main__':
    
        a = [1,13,28,40,100,0]# 0 作为加入数字的占位符
        print('原始列表:')
        for i in range(len(a)):
            print (a[i],)
        number = int(input("插入一个数字:"))
        end = a[4]
        if number > end:
            a[5] = number
        else:
            for i in range(5):
                if a[i] > number:
                    temp1 = a[i]
                    a[i] = number
                    for j in range(i + 1,6):
                        temp2 = a[j]
                        a[j] = temp1
                        temp1 = temp2
                    break
        print ('排序后列表:')
        for i in range(6):
            print (a[i],)
    

    第九题: 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入。
    实际上 a+aa+aaa+aa...a 可以转化为 (a * 100) + (a * 101) + (a * 102)…… 进而转化为 a * (100 + 101 + 102 ……),所以用两个 for 循环就搞定了。
    注意:第1个 for 循环,range()得从1开始计数,这样子第2个 for 循环一开始才能至少循环一次(如果 i = 0,那么 range(i) 就循环不起来了。

    a = int(input('请输入数字a:'))
    count = int(input('请输入几个数相加:'))
    res = 0#初始化最终求解
    for i in range(1,count+1):#循环次数与输入的值一样,但从1开始循环
        t = 0
        for j in range(i):
            t = t + 10**j#先计算10**0+10**1+....+10**j
        res  = res +(a*t)#再计算a*t
    print(res)
    

    第十题:找出1000以内的所有完数。什么是“完数”:
    一个数如果恰好等于它的因子之和,这个数就称为”完数”。例如6=1+2+3.

    for i in range(2,1001):#遍历1000以内的所有数,从2开始
        s = i     #把取出的数赋值给另一个变量s,用于与所有因子作差,如果减去所有因子后结果为0,这个数是完数
        for j in range(1,i):   #查找因子
            if i % j == 0:     #找出因子
                s -=j        #与因子作差
        if s == 0:          #判断是否是完数
            print(i)
    

    完善写法:

    for i in range(2, 1001):
        k = []  
        n = -1  
        s = i
        for j in range(1, i):
            if i % j == 0:
                n += 1
                s -= j
                k.append(j) 
    
        if s == 0:
            print(i, ":") 
            for j in range(n):
                print(str(k[j]), end='+ ') 
            print(k[n])  
    

    相关文章

      网友评论

        本文标题:python常见循环练习

        本文链接:https://www.haomeiwen.com/subject/hnszdqtx.html