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
2.企业发放的奖金根据利润提成。利润(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
3.一个整数,它加上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
4.输入某年某月某日,判断这一天是这一年的第几天?
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, "天")
5.输入三个整数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)
6.题目:斐波那契数列。
程序分析:斐波那契数列(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
8.输出 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('')
9.暂停一秒输出。
import time
if __name__ == '__main__':
myD = {1: 'a', 2: 'b'}
for key, value in dict.items(myD):
print(key, value)
time.sleep(1) # 暂停 1 秒
10.暂停一秒输出,并格式化当前时间
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())))
11.题目:用*号输出字母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 + '*')
12.判断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
13.题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如: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)
14.将一个正整数分解质因数。例如:输入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='') # 打印后面的值
15.题目:利用条件运算符的嵌套来完成此题:学习成绩>=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))
16.题目:输出指定格式的日期。
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'))
17.题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
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))
18.题目:求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)
19.题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如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)
20.题目:一球从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)
21.题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃
了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半多一个。
到第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
22.两个乒乓球队进行比赛,各出三人。甲队为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))
23.打印出如下图案(菱形):
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)
24.有一分数序列: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)
25.题目:求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)
26.利用递归方法求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