python(第二版)第五章答案

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

  Python的标准整形类型是最通用的数字类型。在大多数32位机器上,标准整形类型的取值范围是-2**32~2**32 - 1。

  Python的长整型类型能表达的数值仅仅与你的机器支持的(虚拟)内存大小有关,换句话说,Python能轻松表达很大的整数。

  长整型类型是标准整形类型的超集,当程序需要使用比标准整形更大的整型时,可以使用长整型类型,在整型值后面添加L,表示这个为长整型,这两种整形类型正在逐渐统一为一种。

5-2.操作符。

(a)写一个函数,计算并返回两个数的乘积。

(b)写一段代码调用这个函数,并显示它的结果。

答:

(a)

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

(b)

    x(2,6)

    #或者

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

    if __name__=='__main__':  
        a = input()  
        b = input()  
        print mul(a, b)  

5-3.标准类型操作符。写一段脚本,输入一个测验成绩,根据下面的标准,输出他的评分成绩(A-F)。
   A:90~100

  B:80~89

  C:70~79

  D:60~69

  F:<60

答:

方法一:

    x = input("plz input your score:")
    if x >= 60:
        if x >= 70:
            if x >= 80 :
                if x >= 90:
                    if x >= 100:
                        print "A"
                    else:
                        print "B"
                else:
                    print "C"
            else:
                print "D"
        else:
            print "E"
    else:
        print "F"

方法二:

    def grade(num):
        if 90 <= num <= 100:
            print 'A'
        elif 80 <= num <= 89:
            print 'B'
        elif 70 <= num <= 79:
            print 'C'
        elif 60 <= num <= 69:
            print 'D'
        elif 0 <= num <= 59:
            print 'F'
        else:
            print " The num is invalid."

     try:
            num = int(raw_input("Input a num:"))
            grade(num)
     except ValueError, e:
            print "You must input digits."

5-4.取余。判断给定年份是否是闰年。使用下面的公式。

  一个闰年就是指它可以被4整除,但不能被100整除,或者它既可以被4又可以被100整除。比如1992年、1996年和2000年是闰年,但1967年和1900年则不是闰年。下一个是闰年的整世纪是2400年。

    x = input("plz input year:")
    if x % 4 == 0 and x % 100 != 0:
        print " %d 是闰年" % (x)
    elif x % 400 == 0:
        print " %d 是闰年" % (x)
    else:
        print " %d 不是闰年" % (x)

5-5.取余。取一个任意小于1美元的金额,然后计算可以换成最少多少枚硬币。硬币有1美分、5美分、10美分、25美分4种。1美元等于100美分。

举例来说,0.76美元计算结果应该是3枚25美分,1枚1美分。类似于76枚1美分,2枚25美分+2枚10美分+1枚5美分+1枚1美分这样的结果都是不符合要求的。

方法一:(这是我最笨的做法)

    y = float(raw_input("input dollors:"))
    if y >= 1:
        print "money is too large."
    else:
        y = y * 100
        a = y // 25
        b = (y - a*25) // 10
        c = (y - a *25 - b * 10) // 5
        d = y - a*25 - b*10 - c*5
        s = a + b + c + d
        print "%d" % (s)

方法二:(定义函数)

    def money(num):  
        num = num *100  
        a = num // 25  
        b = (num - a *25)//10  
        c = (num - a* 25 - b *10) //5  
        d = (num -a * 25 - b * 10 - c * 5)  
        return a+b+c+d  

    n = float(raw_input("input dollors:"))  
    print money(n)  

方法三:(这个比较麻烦,是网上某大侠写的,反正我觉得很烦,大家参考一下)

    dollar = float(raw_input("Input the money that less than 1 dollar:"))
    if dollar >= 1:
        print "money is too large."
    elif 0 < dollar < 1:
        temp = int(dollar * 100)
        (N25, temp) = divmod(temp, 25)
        print "%d 25 coins." %N25
        (N10, temp) = divmod(temp, 10)
        print "%d 10 coins." %N10
        (N5, temp) = divmod(temp, 5)
        print "%d 5 coins." %N5
        (N1, temp) = divmod(temp, 1)
        print "%d 1 coins." %N1
    else:
        print "You must input larger than 0."

    except ValueError, e:
        print "You must input a digits."

5-6 算术。写一个计算器程序。你的代码可以接受这样的表达式,两个操作数加一个操作符:N1操作符N2。其中N1和N2为整型或浮点型,操作符可以是+、 -、、/、%、*,分别表示加法、减法、乘法、整型除、取余和幂运算。计算这个表达式的结果,然后显示出来。

提示:可以使用字符串方法 split(),但不可以使用内建函数eval()。

方法一:(用函数的方法,比较简单)

    def test(a,s,b):  
        if s == '+':  
            return a+b  
        elif s == '-':  
            return a-b  
        elif s == '*':  
            return a*b  
        elif s == '/':  
            return a // b  
        elif s == '%':  
            return a%b  
        elif s == '**':  
            return a**b  
        else:  
            return 0  
    if __name__=='__main__':  
        ss = raw_input("input your expression:")  
        if len(ss) == 3:  
            print test(float(ss[0]),ss[1],float(ss[2]))  
        else:  
            print test(float(ss[0]),ss[1:3],float(ss[3])) 

方法二:(特别麻烦,建议不要看)

    print "Enter the expression"
    expression = raw_input('>')

    if len(expression.split('+')) == 2:
        try:
            splitExpression = expression.split('+')
            m = float(splitExpression[0])
            n = float(splitExpression[1])
            print m + n
        except ValueError, e:
            print "Input ValueError !"

    elif len(expression.split('-')) == 2:
        try:
            splitExpression = expression.split('+')
            m = float(splitExpression[0])
            n = float(splitExpression[1])
            print m - n
        except ValueError, e:
            print "Input ValueError !"

    elif len(expression.split('*')) == 2:
        try:
            splitExpression = expression.split('*')
            m = float(splitExpression[0])
            n = float(splitExpression[1])
            print m * n
        except ValueError, e:
            print "Input ValueError !"

    elif len(expression.split('/')) == 2:
        try:
            splitExpression = expression.split('/')
            m = float(splitExpression[0])
            n = float(splitExpression[1])
            print m / n
        except ValueError, e:
            print "Input ValueError !"

    elif len(expression.split('%')) == 2:
        try:
            splitExpression = expression.split('%')
            m = float(splitExpression[0])
            n = float(splitExpression[1])
            print m % n
        except ValueError, e:
            print "Input ValueError !"

    elif len(expression.split('**')) == 2:
        try:
            splitExpression = expression.split('**')
            m = float(splitExpression[0])
            n = float(splitExpression[1])
            print m ** n
        except ValueError, e:
            print "Input ValueError !"

    else:
            print "Input Error !"

5-8.几何。计算面积和体积。

(a)正方形和立方体
(b)圆和球

    import math  

    if __name__=='__main__':  
    ss = input("请输入正方形的长或者园半径:")  
    print '正方形面积:',ss*ss  
    print '立方体面积:',ss*ss*6  
    print '立方体体积:',ss*ss*ss  
    print '圆面积:',ss*ss*math.pi  
    print '球面积:',ss*ss*math.pi*4  
    print '球体积:',ss*ss*ss*math.pi*4/3.0 

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

答:

八进制和十进制,长整形和整形

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

    def change(f):  
        return (f-32)*(5.0/9.0)  
    if __name__=='__main__':  
        ss = input("请输入华氏温度:")  
        print change(ss)

5-11.取余。

(a)使用循环和算术运算,求出0~20之间的所有偶数。

(b)同上,不过这次输出所有的奇数。

(c)综合(a)和(b),请问辨别奇数和偶数的最简单的办法是什么?

(d)使用(c)的成果,写一个函数,检测一个整型能否被另一个整型整除。现要求用户输入两个数,然后你的函数判断两者是否有整除关系,根据判断结果分别返回True和False。

答:(a),(b)

 x = range(0,21)
    for i in x:
        if i % 2 == 0: #输出偶数
        print i 
    for i in x:
        if i % 2 != 0:#输出奇数
        print i

(c)辨别偶数和奇数的方法是,该数能否被2整除。

(d)

    def num(num1,num2):  
        if (num1%num2==0) or (num2%num1==0):  
        return True  
    else:  
        return False  
    num1 = input("请输入第一个数:")  
    num2 = input("请输入第二个数:")  
    print num(num1,num2)  

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

    def test(h , m):  
        min= h * 60 + m  
        return min    
    while True:  
        h = input("请输入小时:")  
        m = input("请输入分钟:")  
        if (h < 23 and h > -1) and (m < 60 and m > -1):  
            print 'The time is %d minuters' % test (h,m)  
        else:  
            print 'input error'  

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

    def gongyueshu(m , n):  
        if m< n:  
            min = m  
        else:  
            min = n  
    for i in range(min , 0 ,-1):  
        if m % i ==0 and n % i ==0:  
            return i  
        return 0  

    def gongbeishu(m , n):  
        l = gongyueshu(m,n)  
        return m * n / l  

    if __name__ == '__main__':  
        m = input("请输入第一个数:")  
        n = input("请输入第二个数:")  
        print '最大公约数:',gongyueshu(m, n)  
        print '最小公倍数:',gongbeishu(m, n) 

5-16 题目好烦,不想写了,大家自己去看,答案在此:

    def Payment(cost,total):  
        count = 0  
        print ' Amount Remaining'  
        print 'Pymt#   PaidBalance'  
        print '-----   ------   --------'  
        while True:  
            print '%-2d   $%.2f  $%6.2f'%(count,total,cost)  
            if cost - total >=0:  
                cost = cost-total  
            else:  
                if cost !=0:  
                    print '%-2d   $%.2f   $%6.2f'%(count+1,cost,0)  
                break  
            count += 1  

    if __name__=='__main__':  
        cost = input('Enter opening balance:')  
        total = input('Enter monthly payment:')  
        Payment(cost,total) 

5-17 随机数。熟读随机数模块然后解下面的题:

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

    import random  
    if __name__=='__main__':  
        N = random.randint(1,100)  
        list = []  
        for i in range(N):  
            n = random.randint(0,2**31-1)  
            list.append(n)  
        list.sort()  
        print list  
  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目链接: https://pintia.cn/problem-sets/14/problems/779 一、目大意 本编写一个函数is_prime(n),判断n是否为素数。若n是素数,则返回True;否则返回False。 二、算法思路 素数指只能被1和自身整除的大于1的正整数。 判断一个数n是否为素数,可以先遍历2到n-1之间的所有数i,若n能被某个i整除,则n不是素数。 但是这种方法的时间复杂度显然过高,不适用于大数判断。 另外一个更高效的算法是“质数筛选法”,即埃拉托斯特尼筛法(Sieve of Eratosthenes)。 该方法的基本思想是从2开始,将每个质数的倍数都标记成合数。一个数如果不是任何数的倍数,则它一定是素数。 步骤如下: 1.先把2作为素数,把2的倍数全部标记为合数。 2.找到下一个未标记的数3,把它作为素数,把3的倍数全部标记为合数。 3.找到下一个未标记的数5,把它作为素数,把5的倍数全部标记为合数。 4.重复步骤2、3直到需要判断的数N的平方根m,若该数为素数,则它没有被除过,即它保留的是初始的值2。 三、代码实现 def is_prime(n): if n < 2: return False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: return False return True 本中只需要实现is_prime函数即可。 is_prime函数首先判断n是否小于2,若是,则不是素数,直接返回False。然后遍历2到n平方根之间的所有数i,若n能被i整除,则n不是素数,返回False。若遍历完所有数都没有返回,则n是素数,返回True。 四、总结 本考察了素数的判断算法,既可以使用暴力枚举的方式,也可以使用高效的质数筛选法。实现过程中需要注意程序的效率和算法的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值