网上搜查到的Python算法题,自己思考完成
【程序1】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数(比如121,212,题目应该是无连续重复数字)都是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
自己写的(这个“无重复数字”存在异议):
list=[1,2,3,4]
list1=[]
i=None
j=None
K=None
for i in list:
for j in list :
for k in list :
num=i*100+j*10+k
list1.append(num)
if i==j or j==k :
list1.pop()
print(list1)
sum=len(list1)
print(sum)
题目原答案:
sum=0 for i in range(1,5,1): for j in range(1,5,1): for k in range(1,5,1): if(i!=j&j!=k): sum=sum+1; print i,j,k # 这里去重 print sum
【程序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,求应发放奖金总数?
自己写的:
a=input('请输入当月利润:')
num=int(a)
bonus=None
def jisuan(num):
if num<=10:
bonus=num*0.1
elif num>10 and num<=20:
bonus=10*0.1+(num-10)*0.075
elif num >20 and num<=40:
bonus=10*0.075+10*0.1+(num-20)*0.05
elif num>40 and num<=60:
bonus=10*0.075+10*0.1+20*0.05+(num-40)*0.03
elif num>60 and num<=100:
bonus=10*0.075+10*0.1+20*0.05+20*0.03+(num-60)*0.015
else:
bonus=10*0.075+10*0.1+20*0.05+20*0.03+40*0.015+(num-100)*0.01
return bonus
a=jisuan(num)
print(a)
原答案:
#coding:utf-8 #题目:企业发放的奖金根据利润提成。利润(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,求 # 应发放奖金总数?
bonus1=100000*0.1
bonus2=bonus1+100000*0.75
bonus4=bonus2+200000*0.5
bonus6=bonus4+200000*0.3
bonus10=bonus6+400000*0.15
mon = input("请输入月利润:
")
if mon<=100000: bonus=mon*0.1
else:
if mon<=200000: bonus=bonus1+(mon-100000)*0.075
else:
if mon <= 400000: bonus = bonus2 + (mon - 200000) * 0.05
else:
if mon <= 600000: bonus = bonus4 + (mon - 400000) * 0.03
else:
if mon <= 1000000: bonus = bonus6 + (mon - 600000) * 0.015
else:
if mon > 1000000: bonus = bonus10 + (mon - 1000000) * 0.01 print bonus
自己写的虽然已经实现,还是需要修改代码
【程序3】
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? (范围都没给????)
自己写:
import math
for i in range(100000):
if (math.sqrt(i+100)-int(math.sqrt(i+100))==0) and (math.sqrt(i+268)-int(math.sqrt(i+268))==0) :
print(i)
答案:
#coding:utf-8
import math
#题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
#第一种解法 判断x,y开方同时为整数即可
print '解法一'
for i in range(100000):
if(math.sqrt(i+100)-int(math.sqrt(i+100))==0):
x = int(math.sqrt(i + 100)) # 开方求x x为浮点数
if (math.sqrt(i + 268) - int(math.sqrt(i + 268)) == 0):
y = int(math.sqrt(i + 268)) # 开方求x x为浮点数
print x,y
print '该数为%d' %i
#第二种 直接求x*x-y*y=168
print '解法二'
for i in range(10000):
for j in range(1000):
if(i*i-j*j==168):
print i,j
print '该数为%d' %(i*i-268)
#第三种 标准解法
print '解法三'
for i in range(100000):
if(math.sqrt(i+100)-int(math.sqrt(i+100))==0):
x = int(math.sqrt(i + 100)) # 开方求x x为浮点数
if (math.sqrt(i + 268) - int(math.sqrt(i + 268)) == 0):
y = int(math.sqrt(i + 268)) # 开方求x x为浮点数
if(x*x==i+100 and y*y==i+268):
print x, y
print '该数为%d' % i
【程序4】
题目:输入某年某月某日,判断这一天是这一年的第几天?
程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
#平年
listmonthrun=[0,31,28,31,30,31,30,31,31,30,31,30,31]
#闰年
listmonthping=[0,31,29,31,30,31,30,31,31,30,31,30,31]
try:
str=input('请输入日期,格式xxxx-xx-xx:')
days=0
year,month,day=str.split('-')
year=int(year)
month=int(month)
day=int(day)
print(type(year),month,day)
if (year%400==0) or (year%4==0 and year%100!=0):
for i in range(0,month):
# print(i)
print(listmonthping[i])
days+=listmonthping[i]
else:
for i in range(0,month):
# print(i)
print(listmonthrun[i])
days+=listmonthrun[i]
days=days+day
print('这一天是这一年中第%s天'%(days))
except Exception as e:
print('输入时间格式有误请重新输入')
答案:
#coding:utf-8
data=raw_input('输入年月份,格式2016-05-12:')
#字符串切割
s=data.split('-')#以-为标志切割
if(len(s)==3):
# 赋值
year = int(s[0])
mon = s[1]
day = s[2]
print mon
# python没有switch case 用字典方式
else:
print '输入有误'
da={'1':0,'2':31,'3':59,'4':90,'5':120,'6':151,'7':181,'8':212,'9':243,'10':273,'11':304,'12':334}
def f(x):
return da.get(x)
sum=int(f(mon))+int(day)
if(year%400==0 or (year%4==0 and year%100!=0)):
if(int(mon)>=3):
sum=sum+1
print sum
【程序5】
题目:输入三个整数x,y,z,请把这三个数由小到大输出。
自己写:
list1=[]
print('请输入三个整数:')
a=int(input('第一个数:'))
list1.append(a)
b=int(input('第二个数:'))
list1.append(b)
c=int(input('第三个数:'))
list1.append(c)
#将三个数加入到列表中
#解法一:使用排序法
def paixu(list):
for i in range(0,len(list)):
for j in range(i+1,len(list)):
if list[i] >list[j]:
temp=list[i]
list[i]=list[j]
list[j]=temp
return list
def printout(list):
for i in list:
print(i)
list2 = paixu(list1)
printout(list2)
#解法二:使用python内置函数
print(list1)
list1=sorted(list1)
printout(list1)
答案:太过繁琐
【程序6】
题目:输出9*9口诀。
for i in range(1,10):
for j in range(1,i+1):
print('%d*%d=%d'%(i,j,i*j),end=' ')
print()
答案:有点繁琐
【程序7】
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
程序分析:斐波那契数列 即1,1,2,3,5,8,13,21…. 第三个数开始下一个数为前面两个数之和
#m1表示第一个月,m2表示第二个月
m1=m2=1
for i in range(1,13):
if i<=2:
print(m1)
else:
m1=m1+m2
m2=m2+m1
print(m1,m2)
【程序7】
题目:判断101-200之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。
import math
for i in range(101,201):
num=math.sqrt(i)
if i%2==0 or i%num==0:
pass
else:
print(i)
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
for i in range(100,1000):
#百位
num1=int(i/100)
#十位
num2=int(i/10)%10
#个位数
num3=i%10
if i==(num1**3+num2**3+num3**3):
print(i)