一、数学问题
题目1:组合数字
题目1: 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
num =[]
for a in range(1,5):
for b in range(1,5):
for c in range(1,5):
if (a != b and a!= c and b!=c) :
num.append(a*100 + b*10 + c)
print(num)
x = [1,2,3,4]
num = [i*100 + j*10 + k for i in x for j in x for k in x if (j != i and k != j and k != i)]
import itertools
num = []
x=[1,2,3,4]
for i in itertools.permutations(x,3):
num.append(i)
print(num)
题目2:利润计算
题目2:企业发放的奖金根据利润提成。
利润(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,求应发放奖金总数?
"""
def get_bonus(profit):
bonus = 0
if profit <= 100000:
bonus = profit*0.1
elif 100000 < profit <= 200000:
bonus = get_bonus(100000) + (profit-100000)*0.075
elif 200000 < profit <= 400000:
bonus = get_bonus(200000) + (profit-200000)*0.05
elif 400000 < profit <= 600000:
bonus = get_bonus(400000) + (profit-400000)*0.03
elif 600000 < profit <= 1000000:
bonus = get_bonus(600000) + (profit-600000)*0.015
else :
bonus = get_bonus(1000000) + (profit-1000000)*0.01
return bonus
get_bonus(1000000)
题目3:完全平方数
题目3:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
"""
分析:
a + 100 = b**2 + 168 = c**2
168 = c**2 - b**2
因为b小于c,且b,c都属于168,所以b∈c
for c in range(1,168):
for b in range(1,c):
if c**2-b**2 == 168:
a = b**2 - 100
print(a)
"""
题目4:日期天数计算
题目4:输入某年某月某日,判断这一天是这一年的第几天?
"""
分析:
1. 月份 + 日 = 天数;
2. 1,4,9,11月 固定30天,3,5,6,8,10,12月 固定31天, 2月闰年28天,非润29天;
3. 考虑系统语言计算差会存在1天误差,所以起始天数为1;
def get_days(year,month,day):
days = [31,28,31,30,31,60,31,31,30,31,30,31]
sum = 1
if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0) :
days[2] = days[2]+1
else:
days[2] = days[2]
for i in range(month-1):
sum += days[i]
return sum
get_days(2021,3,1)
题目11:兔子繁殖问题
题目11:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
"""
分析:
每一对新兔子的第3个月会数量裂变,所以这一对兔子第n月生的兔子数为: sum = 2+(n-2)*2; 第二个兔子对也遵循这个逻辑;
month = [1,2,3,4,5,6,7,8...]
rab_1 = [2,2,2,2,2,2,2,2...]
rab_2 = [0,0,2,2,4,6,8,10...]
rab_3 = [0,0,0,2,2,4,6,8...]
rab_4 = [0,0,0,0,2,2,4,6...]
rab_5 = [0,0,0,0,0,2,2,4]
rab_6 = [0,0,0,0,0,0,2,2]
rab_7 = [0,0,0,0,0,0,0,2]
...
汇总 = [2,2,4,6,10,16,26,42...]
从汇总可得,符合斐波那契数列的变式, 从官网看得理解题目和答案不匹配,一对=2 而不是1;
def rabbits(n):
if n==1 or n==2:
return 2
return rabbits(n-1)+rabbits(n-2)
rabbits(7)
题目18:数列求和
题目18:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制.
"""
分析:
传入2个参数
1.总的几个数相加即最长的长度: len = 5
2.传入的n 是什么: 如 2 22 222 2222 22222
找规律:
2 = 2*10**0 n = 2 幂 = (len-1)
22 = 2*10**1+2
222 = 2*10**2 + 22
2222 = 2*10**3 + 222
得公式: tmp = n*10**(len-1) + tmp
def get_sum(n,len):
sum = 0
tmp = 0
for a in range(1,len+1):
tmp = n*10**(a-1) + tmp
sum += tmp
return sum
get_sum(2,5)
题目19:完数判断
题目19:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
"""
分析: 同14先找因子 然后 n = sum(因子和)
for a in range(1, 1000):
sum = 0
for b in range(1, a):
if a % b == 0:
sum += b
if sum == a:
print(a)
题目21:猴子吃桃
题目21:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个.
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
"""
分析: 每次1/2+1,倒推即最后剩下的(n+1)*2 = n 前一天的
即1 1534/2-1 = 766
2 766/2-1 = 382
3 382/2-1 = 190
4 190/2-1 = 94
5 94/2 -1 = 46
6 46/2 -1 = 22
7 22/2 -1 = 10
8 10/2 -1 = 4
9 4/2 -1 = 1
def peach(rest):
rest = 1
for a in range(1,11):
if a <= 9:
rest = (rest+1)*2
a = a + 1
else:
break
return rest
peach(10)
题目24:分数序列求和
题目24:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
"""
分析:
2 3 5 8 13 21
1 2 3 5 8 13
前20项之和首先得得到第20个数是什么,然后每个数相加
def add_sum(n):
a = 1
b = 1
sum = 0
for i in range(1,n+1):
a,b = b,a+b
sum += b/a
return sum
add_sum(20)
题目25:阶乘累加
题目25:求1+2!+3!+...+20!的和。
"""
分析:24题是累加的概念,这里是累乘
def mul_sum(n):
sum = 0
tmp = 1
for x in range(1,n+1):
tmp *= x
sum += tmp
return sum
mul_sum(3)
题目26:阶乘递归
题目26:利用递归方法求5!。
"""
分析:25题是累乘,26是简单化了
def mul_sum(n):
tmp = 1
for x in range(1,n+1):
tmp *= x
return tmp
mul_sum(5)
题目28:年龄推理
题目28:有5个人坐在一起.
问第五个人多少岁?他说比第4个人大2岁。
问第4个人岁数,他说比第3个人大2岁。
问第3个人,又说比第2人大2岁。
问第2个人,说比第1个人大2岁。
最后问第一个人,他说是10岁。请问第五个人多大?
"""
分析:
递归思想 每前1个人+2岁即可;
age = 10
for i in range(1,5):
if i <=4:
age += 2
else:
age
print(age)
题目80:猴子分桃问题
题目80:海滩上有一堆桃子,五只猴子来分。
第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份.
第三、第四、第五只猴子都是这样做的.
问海滩上原来最少有多少个桃子?
"""
分析: 同21题相似 每5份多1剩4份,连续5次,此外,要考虑分摊除尽的问题,桃子没法分成小于1个;
def monekys(n):
if n==num:
return(4*x)
else:
return(monekys(n+1)*5/4+1)
x=1
while 1:
count=0
for i in range(1,num):
if monekys(i)%4==0 :
count=count+1
if count==num-1:
print("海滩上原来最少有%d个桃子" % int(monekys(0)))
break
else:
x=x+1
题目83:奇数组合数
题目83:求0—7所能组成的奇数个数。
"""
分析:
0-7 共8个数,个位奇数为1,3,5,7,2位数及以上首位不可以为0;
则: 组成1位数是4个
组成2位数是7*4个
组成3位数是7*8*4个
组成4位数是7*8*8*4个
.... 依次类推
L = []
sum = 0
for i in range(1,9):
if i == 1 :
num = 4
sum += num
if i >=2:
num = 4*7*8**(i-2)
sum += num
print(sum)
题目85:9的倍数验证
题目85:输入一个奇数,然后判断最少几个 9 除于该数的结果为整数。
"""
i = int(input('输入奇数: '))
sum = 9
while sum % i != 0:
sum = sum * 10 + 9
print(sum)
题目81:数学等式验证
题目81:80