美文网首页UNSW COMP9021 2019T2
COMP9021 Principles of Programmi

COMP9021 Principles of Programmi

作者: Sisyphus235 | 来源:发表于2017-08-11 12:20 被阅读0次

    常规题目解法如下,选做题有空再补。

    1. Number of trailing 0s in a factorial

    任意一个数的阶乘末尾有多少个0.

    from math import factorial
    
    try:
        n = int(input('Input a nonnegative integer: '))
        if n < 5:
            raise ValueError
    except ValueError:
        print('Incorrect input, giving up.')
    
    n_factorial = factorial(n)
    
    def divide_by_10(n):
        count_0 = 0
        while(n % 10 == 0):
            count_0 += 1
            n //= 10
        return count_0
    
    def string_0(n):
        count_0 = 0
        n = str(n)
        while(n[-1] == '0'):
            count_0 += 1
            n = n[:-1]
        return count_0
    
    def nb_of_5(n):
    #计算一个整数中有多少个质因子5
        nb = 0
        while (n % 5 == 0):
            nb += 1
            n //= 5
        return nb
    
    def smart_5(n):
    #转化问题,n!末尾有多少个0 = n!能被多少个10(2*5)整除;
    #对阶乘而言,被2整除可能性高于被5整除,例如,只要阶乘中有一个偶数就可以被2整除,但是被5整除,阶乘必须大于5
    #n!能被多少个10(2*5)整除 = n!有多少个质因数5
    #n!有多少个质因数5 = n, n-1, n-2, ... 5中共有多少个质因数5
    #n, n-1, n-2, ... 5中共有多少个质因数5 = 被5^1整除的数的个数 + 被5^2整除的数的个数 + ...
    #例如26!,能被5整除的数有5, 10, 15, 20, 25。被5^1整除的数共5个,然后计算被5^2整除的数的个数共2个,所以总共贡献了7个质因数5。
        count_0 = 0
        for e in range(1, n+1):
            count_0 += nb_of_5(e)
        return count_0
    
    print(f'Computing the number of trailing 0s in {n}! by dividing by 10 for long enough: ', divide_by_10(n_factorial))
    print(f'Computing the number of trailing 0s in {n}! by converting it into a string: ', string_0(n_factorial))
    print(f'Computing the number of trailing 0s in {n}! the smart way: ', smart_5(n))
    

    2. Perfect numbers

    A number is perfect if it is equal to the sum of its divisors, itself excluded. For instance, the divisors of 28 distinct from 28 are 1, 2, 4, 7 and 14, and 1+2+4+7+14 = 28, hence 28 is perfect. Write a program perfect.py that prompts the user for an integer N. If the input is incorrect then the program outputs an error message and exits. Otherwise the program outputs all perfect numbers at most equal to N. Implement a naive solution, of quadratic complexity, so that can deal with small values of N only.

    import sys
    
    try:
        n = int(input('Input an integer: '))
        if n <= 1:
            raise ValueError
    except ValueError:
        print('The input is not legal.')
        sys.exit()
    
    def perfect(n):
        divisor = []
        for i in range(1, n):
            if (n % i == 0):
                divisor.append(i)
        total = 0
        for e in divisor:
            total += e
        if total == n:
            return True
        else:
            return False
    
    for i in range(1, n+1):
    #range范围要注意,1不是perfect number,最后要用n+1才能包括n
        if perfect(i):
            print(f'{i} is a perfect number.')
    

    3. Decoding a multiplication

    #三位数×两位数,结果4位数,中间过程两个数一个4位一个3位,每列数字和一样
    #   4  1  1
    #*     1  3
    #----------
    #1  2  3  3
    #4  1  1
    #----------
    #5  3  4  3
    #sum column
    #10 10 10 10
    '''
    def column_equal(multiple_1, multiple_2, middle_1, middle_2, result):
        column_1 = multiple_1%10 + multiple_2%10 + middle_1%10 + result%10
        column_2 = multiple_1//10%10 + multiple_2//10 + middle_1//10%10 + middle_2%10 + result//10%10
        column_3 = multiple_1//100 + middle_1//100%10 + middle_2//10%10 + result//100%10
        column_4 = middle_1//1000 + middle_2//100%10 + result//1000%10
        column_5 = middle_2//1000 + result//100000
        if column_1 == column_2 and column_2 == column_3 and column_3 == column_4:
            if column_5 == 0:
                return (True, column_1)
            elif column_4 == column_5:
                return (True, column_1)
            else:
                return (False, column_1)
        else:
            return (False, column_1)
    
    for i in range(100, 1000):
        for j in range(10, 100):
            middle_1 = i * (j % 10)
            middle_2 = i * (j // 10)
            result = i * j
            col = column_equal(i, j, middle_1, middle_2,result)
            if col[0]:
                print(f'{i} * {j} = {result}, all columns adding up to {col[1]}.')
    

    4.Estimating the probabilities of hypotheses in the light of more and more evidence

    Write a program bayes.py that simulates the cast of an unknown die, chosen from a set of 5 dice with 4, 6, 8, 12, and 20 faces. To start with, every die has a probability of 0.2 to be the chosen die. At every cast, the probability of each die being the chosen die is updated using Bayes’ rule (find out about it if you do not know it). The probabilities are displayed for at most 5 casts. If more than 5 casts have been requested, the final probabilities obtained for the chosen number of casts are eventually displayed.

    To be continued
    

    相关文章

      网友评论

        本文标题:COMP9021 Principles of Programmi

        本文链接:https://www.haomeiwen.com/subject/foplrxtx.html