python基础100题

  1. 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
def test_01():
    count = 0
    num_lst = []
    for i in range(1, 5):
        for j in range(1, 5):
            for k in range(1, 5):
                if (i != j) & (j != k) and (i != k):
                    count = count + 1
                    print("第", count, "个不重复数", ":", i * 100 + j * 10 + k)
                    num_lst.append(i * 100 + j * 10 + k)
    return num_lst

  1. 企业发放的奖金根据利润提成。利润(profit)低于或等于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%提成,从键盘输入当月利润profit,求应发放奖金总数?
    程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型
def test_02(profit):
    rate = [0.1, 0.075, 0.05, 0.03, 0.015, 0.01]
    amount = [10, 20, 40, 60, 100]
    
    sum0 = amount[0] * rate[0]
    sum1 = sum0 + (amount[1] - amount[0]) * rate[1]
    sum2 = sum1 + (amount[2] - amount[1]) * rate[2]
    sum3 = sum2 + (amount[3] - amount[2]) * rate[3]
    sum4 = sum3 + (amount[4] - amount[3]) * rate[4]
    
    if profit <= 10:
        return profit * rate[0]
    elif (profit > 10) and (profit <= 20):
        return sum0 + (profit - amount[0]) * rate[1]
    elif (profit > 20) and (profit <= 40):
        return sum1 + (profit - amount[1]) * rate[2]
    elif (profit > 40) and (profit <= 60):
        return sum2 + (profit - amount[2]) * rate[3]
    elif (profit > 60) and (profit <= 100):
        return sum3 + (profit - amount[3]) * rate[4]
    elif profit > 100:
        return sum4 + (profit - amount[4]) * rate[5]
    else:
        print("输入金额错误!")
def test_02_1():
    i = int(input("净利润:"))
    arr = [1000000, 600000, 400000, 200000, 100000, 0]
    rat = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]
    r = 0
    for idx in range(0, 6):
        if i > arr[idx]:
            # print(idx)
            r += (i - arr[idx]) * rat[idx]
            # print((i - arr[idx]) * rat[idx])
            i = arr[idx]
    print(r)
    return r

  1. 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
def test_03():
   num_lst = []
   for number in range(1, 9999):
       number1 = number + 100
       number2 = number + 100 + 168
       for i in range(int(math.sqrt(number1)), number1):
           if i * i == number1:
               for j in range(int(math.sqrt(number2)), number2):
                   if j * j == number2:
                       # print(number)
                       num_lst.append(number)
   return num_lst

  1. 输入某年某月某日,判断这一天是这一年的第几天?

if __name__ == '__main__':
    months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    
    date = input("year-day:")
    
    year = int(date.split("-")[0])
    month = int(date.split("-")[1])
    day = int(date.split("-")[2])
    
    print(year, month, day)
    
    # 判断是闰年还是平年
    if (year % 4 == 0) or (year % 400 == 0) and (year % 100 != 0):
        months[1] = 29
        print(year, "是闰年")
    else:
        print(year, "是平年")
    
    print(months)
    s1 = 0
    if month == 1:
        s1 = day
        print(date, "是第", s1, "天")
    else:
        for i in months[:month - 1]:
            s1 = s1 + i
        s2 = s1 + day
        print(date, "是本年度第", s2, "天")

  1. 输入三个整数x,y,z,请把这三个数由小到大输出
def f1(x, y, z):
    lst = [x, y, z]
    lst.sort()
    print(lst)

# 常规解法
def Verify_max(x, y, z):
    lst = []
    lst.append(x)
    lst.append(y)
    lst.append(z)
    lst.sort()
    
    for e in lst:
        print(e)

# 解法 2
def V_max(a, b, c):
    m = max(a, b, c)
    l = min(a, b, c)
    
    for i in [a, b, c]:
        if i not in [m, l]:
            z = i
    
    for e in [l, z, m]:
        print(e)

# 最简洁
def Sort_L(a, b, c):
    l = sorted((a, b, c))
    for i in l:
        print(i)

def f2():
    lst = []
    for i in range(0, 3):
        x = int(input("integer:"))
        lst.append(x)
    lst.sort()
    print(lst)

  1. 题目:斐波那契数列。

程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。
在数学上,费波那契数列是以递归的方法来定义:

F0=0 (n=0)
F1=1 (n=1)
Fn = F(n-1) + F(n-2) (n>=2)

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....

def test_06(n):
    a, b = 1, 1
    for i in range(n - 1):
        a, b = b, a + b
    return a


def test_06_1(n):
    if n == 1 or n == 2:
        return 1
    return test_06_1(n - 1) + test_06_1(n - 2)


def test_06_2(n):
    if n == 1:
        return [1]
    if n == 2:
        return [1, 1]
    fibs = [1, 1]
    for i in range(2, n):
        fibs.append(fibs[-1] + fibs[-2])
    return fibs

7.将一个列表的数据复制到另一个列表中

def f(lst1):
    lst2 = lst1[:]
    return lst2
  1. 输出 9*9 乘法口诀表。

def func():
    for i in range(1, 10):
        for j in range(1, 10):
            print(" %d*%d=%d " % (i, j, i * j), end="")
            if i == j:
                print("")
                break

def func2():
    for i in range(1, 10):
        print()
        for j in range(1, i + 1):
            print("%d*%d=%d" % (i, j, i * j), end=" ")

def func3():
    for i in range(1, 10):
        for j in range(1, i + 1):
            v = i * j
            print("%d*%-1d=%-4d" % (i, j, v), end=" "),
            if i == j:
                print('')
  1. 暂停一秒输出。
import time

if __name__ == '__main__':
    
    myD = {1: 'a', 2: 'b'}
    for key, value in dict.items(myD):
        print(key, value)
        time.sleep(1)  # 暂停 1 秒
  1. 暂停一秒输出,并格式化当前时间
import time

if __name__ == '__main__':
    print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
    
    # 暂停一秒
    time.sleep(1)
    
    print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
  1. 题目:用*号输出字母C的图案。
def Output():
    s = ' '
    for i in range(8, -1, -2):
        print(s * i + '*')
    print('*')
    for i in range(1, 8, 2):
        print(s * i + '*')

  1. 判断101-200之间有多少个素数,并输出所有素数
    程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
def func():
    num_lst = []
    for i in range(101, 200):
        for j in range(2, int(math.sqrt(i))):
            if i % j == 0:
                num_lst.append(i)
                break
            else:
                continue
    
    lst = []
    for j in range(101, 200):
        if j not in num_lst:
            lst.append(j)
    
    return lst
  1. 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。

def func():
    for n in range(100, 1000):
        i = n / 100
        j = n / 10 % 10
        k = n % 10
        if n == i ** 3 + j ** 3 + k ** 3:
            print(n)
  1. 将一个正整数分解质因数。例如:输入90,打印出90=233*5。
def func(n):
    num = n
    lst = []  # 存放质因数的列表
    
    for i in range(int(n / 2) + 1):  # 判断次数仅需该数字的一半多1次
        for j in range(2, n):
            if n % j == 0:  # 若能整除
                n = n // j  # 除以质因数后的n重新进入判断,注意应用两个除号,使n保持整数
                lst.append(j)  # 则表示i是质因数
                break  # 找到1个质因数后马上break,防止非质数却可以整除的数字进入质因数列表
    if len(lst) == 0:  # 若一个质因数也没有
        print('该数字没有任何质因数。')
    else:  # 若至少有一个质因数
        lst.append(n)  # 此时n已被某个质因数整除过,最后一个n也是其中一个质因数
    lst.sort()  # 排下序
    print('%d=%d' % (num, lst[0]), end='')  # 打印头两个值
    for i in range(1, len(lst)):
        print('*%d' % lst[i], end='')  # 打印后面的值
  1. 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
def func():
    score = int(input('输入分数:\n'))
    if score >= 90:
        grade = 'A'
    elif score >= 60:
        grade = 'B'
    else:
        grade = 'C'
    
    print('%d 属于 %s' % (score, grade))
  1. 题目:输出指定格式的日期。
import datetime

if __name__ == '__main__':
    
    # 输出今日日期,格式为 dd/mm/yyyy。更多选项可以查看 strftime() 方法
    print(datetime.date.today().strftime('%d/%m/%Y'))
    
    # 创建日期对象
    day = datetime.date(1941, 1, 5)
    print(day.strftime('%d/%m/%Y'))
    
    # 日期算术运算
    nextDay = day + datetime.timedelta(days=1)
    print(nextDay.strftime('%d/%m/%Y'))
    
    # 日期替换
    firstDay = day.replace(year=day.year + 1)
    print(firstDay.strftime('%d/%m/%Y'))
  1. 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
def func():
    s = input("请输入一个字符串:")
    
    letters = 0
    spaces = 0
    digits = 0
    others = 0
    
    i = 0
    while i < len(s):
        c = s[i]
        if c.isalpha():
            letters += 1
        elif c.isspace():
            spaces += 1
        elif c.isdigit():
            digits += 1
        else:
            others += 1
        i += 1
    print("char=%-2d, space=%-2d,digit=%-2d,others=%-2d" % (letters, spaces, digits, others))

# 方法2
def func2():
    s = input("请输入一个字符串:")
    
    letters = 0
    spaces = 0
    digits = 0
    others = 0
    
    for c in s:
        if c.isalpha():
            letters += 1
        elif c.isspace():
            spaces += 1
        elif c.isdigit():
            digits += 1
        else:
            others += 1
    print("char=%-2d, space=%-2d,digit=%-2d,others=%-2d" % (letters, spaces, digits, others))
  1. 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。

def func():
    a = input('输入数字>>>')
    count = int(input('几个数字相加>>>'))
    ret = []
    for i in range(1, count + 1):
        ret.append(int(a * i))  # 字符乘以数字将会是重复字符,将字符再转换为整形
        print(ret[i - 1])
    print(sum(ret))


"""
    方法二
"""


def func1():
    a = input('输入数字>>>')
    count = int(input('几个数字相加>>>'))
    
    res = 0  # 根据count获取值的长度
    lst = []  # 每位数的值置列表,然后计算列表中的和
    for i in range(1, count + 1):  # 循环次数与输入的值一样,但从1开始循环
        if i == 1:
            res = int(a)
            lst.append(res)
        else:
            res += 10 ** (i - 1) * int(a)
            lst.append(res)
    print(lst)
    
    res_value = 0
    for i in lst:
        res_value += int(i)
    
    print(res_value)
  1. 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
def test_func():
    cst = []  # 完数列表
    
    for i in range(1, 1000):
        print("--:", i)
        ast = []  # 所有因子列表
        bst = []  # 不重复因子列表
        for j in range(1, i):
            if i % j == 0:
                ast.append(j)
                continue
        
        # print("所有因子:", ast)
        for e in ast:
            if e not in bst:
                bst.append(e)
        print("不重复因子:", bst)
        
        # 判断是否是完数
        res = 0  # 计算因子之和
        for v in bst:
            res += int(v)
        
        if res == i:  # 判断是否完数
            cst.append(i)
    print("----------------------------------")
    print("1000以内的完数列表:", cst)

  1. 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
def test_func(n):
    lst = []  # 反弹高度的列表统计
    result = 0.00  # 共经过多少米
    
    h = 100
    for i in range(1, n + 1):
        if i == 1:  # 第一次下落100
            lst.append(h)
        else:
            lst.append(h / 2 ** (i - 1) * 2)
    print(lst)
    for i in lst:
        result += i
    
    return result


#   每次反弹的高度,每次落地后反跳回原高度的一半
def rebound(n):
    return 100 / (2 ** n)
  1. 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃
    了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
    以后每天早上都吃了前一天剩下的一半多一个。
    到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少

最佳方法(递归)

def Calc_peach(N):
    if N == 1:
        return 1
    else:
        return (1 + Calc_peach(N-1)) * 2

常规方法一

def func(day):
    S = 1
    for i in range(day, 1, -1):
        S = (S + 1)*2
        
    print S

常规方法二

x2 = 1
for day in range(9,0,-1):
    x1 = (x2 + 1) * 2
    x2 = x1
print x1
  1. 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

方法一

for a in ['x','y','z']:
    for b in ['x', 'y', 'z']:
        for c in ['x', 'y', 'z']:
            if(a!=b)and(b!=c)and(c!=a) and (a!='x') and (c!='x') and (c!='z'):
                print('a和%s比赛,b和%s比赛,c和%s比赛' %(a,b,c))

方法二

for i in range(ord('x'),ord('z') + 1):
    for j in range(ord('x'),ord('z') + 1):
        if i != j:
            for k in range(ord('x'),ord('z') + 1):
                if (i != k) and (j != k):
                    if (i != ord('x')) and (k != ord('x')) and (k != ord('z')):
                        print ('order is a -- %s\t b -- %s\tc--%s' % (chr(i),chr(j),chr(k)))

方法三


import itertools

A = ["a", "b", "c"]
B = ["x", "y", "z"]
team = []  # 存储比赛名单
rankB = [list(each) for each in itertools.permutations(B)]  # 将对手的全部组合方式列出来
while True:
    flag = 0
    team = list(zip(A, B))  # 匹配选手
    print(team)
    for each in team:
        if (("a" in each) and ("x" in each)) or (("c" in each) and (("x" in each) or ("z" in each))):  # 判断是否符合对阵要求
            flag = 1  # 如不符合则打个标记
            break
    if flag:
        B = rankB.pop()  # 改变一下对手位置
    else:
        break

for v1, v2 in team:
    print("%s 对阵 %s" % (v1, v2))
  1. 打印出如下图案(菱形):


    image.png
for i in range(1, 8, 2):
    print(' ' * (4 - (i + 1) //2) + '*' * i)
for i in range(5, 0, -2):
    print(' ' * (4 - (i + 1) // 2) + '*' * i)

  1. 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
def func(a,b,N):
    if N == 1:
        return float(a) / b
    else:
        a = a + b
        b = a - b
        return float(a) / b  + func(a ,b ,N-1)
  1. 题目:求1+2!+3!+...+20!的和。

n = 0
s = 0
t = 1
for n in range(1,21):
    t *= n
    s += t
print( '1! + 2! + 3! + ... + 20! = %d' % s)
  1. 利用递归方法求5!
'''
题目:利用递归方法求5!
'''

def func(N):
    if N == 1:
        return 1
    else:
        return N * func(N-1)

if __name__ == "__main__":

    N = int(raw_input("Please enter an num: "))
            
    res = func(N)

    print "res is : %r" %res

你可能感兴趣的:(python基础100题)