python核心编程课后习题解答第五章

5-1 整形 讲讲Python 普通整型和长整型的区别

python普通整型在大多数32位机器上取值范围是-2^31--2^31-1,长整形类型能表达的数值仅仅与机器支持的内存大小有关。

5-2 运算符
(a) 写一个函数,计算并返回两个数的乘积
(b) 写一段代码调用这个函数,并显示它的结果

def multiply(a,b):
  return a*b

m=3
n=4
print multiply(m,n)

5-3 标准类型运算符. 写一段脚本,输入一个测验成绩,根据下面的标准,输出他的评分
成绩(A-F)。
A: 90–100
B: 80–89
C: 70–79
D: 60–69
F: <60

coin=raw_input('please input mark: ')
coin_int=int(coin)
if 90<=coin_int<=100:
  print "you get A"
elif 80<=coin_int<90:
  print "you get B"
elif 70<=coin_int<80:
  print "you get C"
elif 60<=coin_int<70:
  print "you get D"
elif 0<coin_int<60:
  print "you get F"
else:
  print "plese input a correct mark."

 

5-4 取余。判断给定年份是否是闰年。使用下面的公式:
一个闰年就是指它可以被4 整除,但不能被100 整除, 或者它既可以被400 (书中此处写错了,写的是4)又可以被100 整
除。比如 1992,1996 和2000 年是闰年,但1967 和1900 则不是闰年。下一个是闰年的整世
纪是 2400 年。

 

year_input=raw_input("please input a year: ")
year=int(year_input)
if (year%4==0 and year%100<>0) or (year%400==0 and year%100==0):
print "Leap Year;"
else:
print "NOT Leap Year;"

5-5 取余。取一个任意小于1 美元的金额,然后计算可以换成最少多少枚硬币。硬币有1
美分,5 美分,10 美分,25 美分四种。1 美元等于100 美分。举例来说,0.76 美元换算结果
应该是 3 枚25 美分,1 枚1 美分。类似76 枚1 美分,2 枚25 美分+2 枚10 美分+1 枚5 美分+1
枚1 美分这样的结果都是不符合要求的。

a1=1
a2=5
a3=10
a4=25

money=raw_input("please input a coin: ")
while int(money)>100 or int(money) <=0:
  money=raw_input("please input a coin: ")
money=int(money)
for i in range(101):
  for j in range(21):
    for k in range(11):
      for l in range(5):
        money_end=l*25+k*10+j*5+i*1
        if money_end==money:
          print i ,j ,k ,l
          break
      if money_end==money:
        break
    if money_end==money:
      break
  if money_end==money:
    break
print "you can use this way: %d 25coin %d 10coin %d 5coin %d 1coin" % (l,k,j,i)

博客园中Balian写的代码更为精辟:

    b = '0123456789'
    if len(a) == 2 and a[0] in b and a[1] in b: return True
    else: return False
    
def change(a):
    N25 = int(a) / 25
    N10 = (int(a) - 25 * N25) / 10
    N5  = (int(a) - 25 * N25 - 10 * N10) / 5
    N1  = int(a) - 25 * N25 - 10 * N10 - 5 * N5
    print '%i cents can be changed to:' % int(a)
    print '25 Cents: %i' % N25
    print '10 Cents: %i' % N10
    print ' 5 Cents: %i' % N5
    print ' 1 Cents: %i' % N1     
    
a = raw_input("Please input the number in U.S cents: ... ")
if verify(a): change(a) 
else: print "Invalid input, Please try again."

5-6 算术。写一个计算器程序 你的代码可以接受这样的表达式,两个操作数加一个运算符:
N1 运算符 N2. 其中 N1 和 N2 为整数或浮点数,运算符可以是+, -, *, /, %, ** 分别表示
加法,减法, 乘法, 整数除,取余和幂运算。计算这个表达式的结果,然后显示出来。提示:
可以使用字符串方法 split(),但不可以使用内建函数 eval().

gongshi=raw_input("请输入公式(单公式不能累加,例如只能1+2,不能1+2+3): ")
for i in range(len(gongshi)):
  coporate=gongshi[i]
  if coporate not in['0','1','2','3','4','5','6','7','8','9']:
    print "操作符为:"+coporate
    break
if gongshi[i] not in['+','-','*','/','%','^']:
  print "你输入的公式有误,请重新运行程序并正确输入公式。。"
  exit()
num=gongshi.split(gongshi[i])
print num[0],num[1]
temp_num =list(gongshi)
temp_num.remove(coporate)
if coporate == '+':
  print "计算结果为:" + gongshi + "=" + str(float(num[0])+float(num[1]))
elif coporate == '-':
  print "计算结果为:" + gongshi + "=" + str(float(num[0])-float(num[1]))
elif coporate == '*':
  print "计算结果为:" + gongshi + "=" + str(float(num[0])*float(num[1]))
elif coporate == '/':
  print "计算结果为:" + gongshi + "=" + str(float(num[0])/float(num[1]))
elif coporate == '%':
  print "计算结果为:" + gongshi + "=" + str(float(num[0])%float(num[1]))
elif int(float(num[1]))==float(num[1]):
  print "计算结果为:" + gongshi + "=" + str(float(num[0])**float(num[1]))
else:
  print "乘方计算时,指数不能为小数,请重新运行程序并正确输入公式。。"

 

5-7 营业税。随意取一个商品金额,然后根据当地营业税额度计算应该交纳的营业税。

参考Balian写得答案:

purePrice = float(raw_input('Please input the price: ... '))
print 'You should pay:'
print 'Subtotal: %10.2f ' % purePrice
print 'Sales Tax: %10.2f ' % round(purePrice * 0.11, 2)
print 'TOTAL: %10.2f ' % (purePrice + round(purePrice * 0.11, 2))

5-8 几何。计算面积和体积:
(a) 正方形 和 立方体
(b) 圆 和 球

type=raw_input("请输入你要计算的几何种类(A正方形,B立方体,C圆,D球): ")

if type=="A":
b=raw_input("请输入正方形的边长: ")
a=float(b)
print "正方形的面积为:%f" %(a*1.000*a)
elif type=="B":
b=raw_input("请输入正方体的边长: ")
a=float(b)
print "正方形的面积为:%f" %(a*1.000*a*6)
elif type=="C":
b=raw_input("请输入圆的半径: ")
a=float(b)
print "正方形的面积为:%f" %(3.14159*a*a)
elif type=="D":
b=raw_input("请输入球的半径: ")
a=float(b)
print "正方形的面积为:%f" %(4*3.14159*a*a)
else:
print "你输入的几何种类错误,请重新运行程序重新输入"

5–9. 数值形式 回答下面关于数值格式的问题:
(a) 为什么下面的例子里 17+32 等于49, 而 017+32 等于47, 017+032 等于41?
>>> 17 + 32

49
>>> 017+ 32
47
>>> 017 + 032
41
(b)为什么下面这个表达式我们得到的结果是 134L 而不是1342 ?
>>> 56l + 78l
134L

a.   017为8进制,转成十进制为8+7=15 所以15+32=49,同理032转换成十进制为3*8+2=26,26+15=41

b.56后面是英文字母l,不是数字1,表示为长整形

5-10 转换。写一对函数来进行华氏度到摄氏度的转换。转换公式为C = (F - 32) * (5 / 9)
应该在这个练习中使用真正的除法, 否则你会得到不正确的结果。

a=raw_input("请输入华氏温度:")
try:
  b=float(a)
except ValueError,e:
  print "请重新运行程序,并正确输入华氏温度。"
  exit()
print "转换成的摄氏温度为:%10.2f" %((b - 32) * (5.00/ 9))

 

5-11 取余。
(a) 使用循环和算术运算,求出 0-20 之间的所有偶数
(b) 同上,不过这次输出所有的奇数
(c) 综合 (a) 和 (b), 请问辨别奇数和偶数的最简单的方法是什么?
(d) 使用(c)的成果,写一个函数,检测一个整数能否被另一个整数整除。 先要求用户输
入两个数,然后你的函数判断两者是否有整除关系,根据判断结果分别返回 True 和 False;

 

(a)\(b):

lis1=[]
lis2=[]
for i in range(1,21):
  if i%2==0:
    lis1.append(i)
  else:
    lis2.append(i)
  print lis1 #输出偶数列表
  print lis2 ##输出奇数列表

(c):

跟2相除取余

(d):

def testdiv(m,n):
  if (b1>b2 and b1%b2==0) or (b1<=b2 and b2%b1==0):
    return True
  else:
    return False

a1=raw_input("请输入第一个整数: ")
a2=raw_input("请输入第二个整数: ")
try:
  b1=int(a1)
  b2=int(a2)
except ValueError,e:
  print "请重新运行程序,并正确输入整数。"
  exit()

if testdiv(b1,b2)==1:
  print "能整除"
else:
  print "不能整除"

5-12 系统限制。写一段脚本确认一下你的Python 所能处理的整数,长整数,浮点数和复
数的范围。

import sys
print sys.maxint
print sys.float_info
print sys.maxint
print -sys.maxint-1
print sys.float_info.max
print sys.float_info.min

5-13 转换。写一个函数把由小时和分钟表示的时间转换为只用分钟表示的时间。

def transform(time):
  lis=time.split(":")
  print lis
try:
  a=float(lis[0]) #取时间的小时数
  b=float(lis[1]) #取时间的分钟数
except ValueError,e:
  print "您输入的时间格式有误,请重新运行程序,重新正确输入。"
  exit()
if a<0 or a>23:
  print "小时数不能小于0或者超过23,请重新运行程序,重新正确输入。"
  exit()
if b<0 or b>59:
  print "分钟数不能小于0或者超过59,请重新运行程序,重新正确输入。"
  exit()
print "转换成分钟后为:%d 分钟" %(a*60+b)

time=raw_input("请输入时间(例如23:45):")
transform(time)

5-14 银行利息。写一个函数,以定期存款利率为参数, 假定该账户每日计算复利,请计
算并返回年回报率。

def jisuan(lilv):

  print "年回报率为:%f" %(10000.00*lilv*365/10000.00)
lilv=raw_input("请输入存款利率")
lilv=float(lilv)
jisuan(lilv)

 5–15. 最大公约数和最小公倍数。请计算两个整数的最大公约数和最小公倍数。

#coding=utf-8

def m(x,y):
  while y!=0:
    z=x%y
    x=y
    y=z
  return x

a=int(raw_input("请输入第一个整数:"))
b=int(raw_input("请输入第二个整数:"))

if a==b<>0:
  print "最大公约数和最小公倍数均为:%d" %a

if a<b:
  a,b=b,a
n=m(a,b)
print "最大公约数为:%d" %n
print "最小公倍数为:%d" %(a*b/n)

 

5-16 家庭财务。给定一个初始金额和月开销数, 使用循环,确定剩下的金额和当月的支
出数, 包括最后的支出数。 Payment() 函数会用到初始金额和月额度, 输出结果应该类似下
面的格式(例子中的数字仅用于演示):
Enter opening balance:100.00
Enter monthly payment: 16.13
Amount Remaining
Pymt# Paid Balance
----- ------ ---------
0 $ 0.00 $100.00
1 $16.13 $ 83.87
2 $16.13 $ 67.74
3 $16.13 $ 51.61
4 $16.13 $ 35.48
5 $16.13 $ 19.35
6 $16.13 $ 3.22
7 $ 3.22 $ 0.00

#coding=utf-8
def Payment(x,y):
  print "0 $ 0.00 $%.2f" %x
  i=0
  while x>=y:
    print "%d $%.2f $ %.2f " %(i,y,(x-y))
    i+=1
    x=x-y
  print "%d $%.2f $ %.2f " %(i,x,0.00)
  pass

balance = float(raw_input("Enter opening balance:"))
payment1 = float(raw_input("Enter monthly payment:"))
if balance < payment:
  print "Error, please run!"
  exit()
print "Amount Remaining"
print "Pymt# Paid Balance"
print "----- ------ ---------"
Payment(balance,payment1)

5-17 随机数。熟读随机数模块然后解下面的题:
生成一个有 N 个元素的由随机数 n 组成的列表, 其中 N 和 n 的取值范围分别为: (1 <
N <= 100), (0 <= n <= 231 -1)。然后再随机从这个列表中取 N (1 <= N <= 100)个随机数
出来, 对它们排序,然后显示这个子集。

import random
N=random.randint(2,100)
lis=[]
for i in range(N):
  n=random.randint(0,230)
  lis.append(n)
lis2=[]
for i in range(N):
  lis2.append(lis[random.randint(0,N-1)])
lis2.sort()
print lis2

 

posted @ 2013-08-30 20:27  forwhy  阅读(2204)  评论(0编辑  收藏  举报