2020-04
11

辗转相除法

By xrspook @ 20:51:51 归类于: 扮IT

题目是这样的

Exercise 5: The greatest common divisor (GCD) of a and b is the largest number that divides both of them with no remainder. One way to find the GCD of two numbers is based on the observation that if r is the remainder when a is divided by b, then gcd(a, b) = gcd(b, r). As a base case, we can use gcd(a, 0) = a. Write a function called gcd that takes parameters a and b and returns their greatest common divisor.

为什么从前我学最大公约数的时候就不是用这个方法呢?如果数字很大,这个应该很快吧,以前我们用的是质因数分解法,我一直没用过其它方法。这里用的是辗转相除法,也叫欧几里德算法,估计在外国这是基础算法,否则Excel也不会有GCD(A, B)这个求最大公约数的公式……

深感自己的无知……

1
2
3
4
5
6
7
8
9
10
11
12
def gcd(a, b): # 可以在Excel里用GCD(a, b)函数测试结果
    if b == 0:
        return a 
    else:
        return gcd(b, a%b) # b不断取代a,b不断被a%b取代
a = int(input('a is '))
b = int(input('b is '))
print(gcd(a, b))
# result
# a is 1024
# b is 480
# 32
2020-04
10

判断a是不是b的幂

By xrspook @ 23:59:43 归类于: 扮IT

Think Python 2第六章的某道原题是这样的:

Exercise 4: A number, a, is a power of b if it is divisible by b and a/b is a power of b. Write a function called is_power that takes parameters a and b and returns True if a is a power of b. Note: you will have to think about the base case.

版本A的中文翻译

练习4:一个数字a为b的权(power),如果a能够被b整除,并且a/b是b的权。写一个叫做is_power 的函数接收a和b作为形式参数,如果a是b的权就返回真。注意:要考虑好基准条件。

版本B的中文翻译

习题6-4:当数字a能被b整除,并且a/b是b的幂时,它就是b的幂。编写一个叫is_power的函数,接受两个参数a和b,并且当a是b的幂时返回True。注意:你必须要想好基础情形。

研究这道题到底在说什么,我纠结了起码1个小时。什么叫做权?幂来幂去,还有“它”,你真的知道那指代的是什么?我相信翻译这本书的人都一定是编程老手,但你们真的有琢磨过中文表述是否恰当吗?幸好我没买人民邮电出版社出版的Think Python 2中文版,貌似从某些页面看来,翻译也会让我非常吐槽。

还是直接看英文原文比较好懂,那段话我会这么翻译:

如果a能被b整除,且a/b是b的幂,那么a是b的幂(例如:2**3=8,即2的3次幂等于8,a=8, b=2)。编写一个名叫is_power的函数,以a和b为形式参数接收数据,如果a是b的幂,返回True。注意:要考虑好基准条件。

研究这道题在说什么研究了好长时间,随便输入几个显而易见的测试数据也挺顺利, 但要把情况想周全貌似很不简单。a == 0的情况有人想到了,但万一作死的写了b == 0呢!测试过好几个网友的编程,b == 0几乎全部挂了…… 我承认,这样测试过分了。

1
2
3
4
5
6
7
8
9
10
11
12
def is_power(a, b):
    if a == 0 or b == 0 or a%b != 0: # a和b的特殊情况先杀死
        return False
    elif a == 1 or a == b: 
        return True
    else:        
        return is_power(a/b, b) # 被除数a为0会死循环,除数b不能为0
a = 4 # int(input('a is '))
b = 2 # int(input('b is '))
print('a =', a)
print('b =', b)
print(is_power(a, b))
2020-04
9

转换时间戳

By xrspook @ 15:18:47 归类于: 扮IT

脑袋实在转不过来,不知道怎么把1W多天转化为月份,长短月怎么处理?????所以直接暴力地使用本来就内置的time.localtime()以及time.strftime()格式化当前时间。我完全可以把逝去的时间也这么整,但逝去时间我是有认真人肉计算过的,所以同一个时间戳,用了两种方式转化。

经过这个以后,我完全明白点点导出数据里那一串标记着的数字是什么鬼,也不能说他们这样不好,因为转化为实在人肉可读的时间格式以后万一要用其它表达方式呢?一开始就用最原始的东西,前端表达用内置的函数格式化也就可以了。所以,大概看懂的人会会心微笑,看不懂的人会骂街。作为理论上应该可读的XML文件,他们这般“原始输出”实在够姜!

1
2
3
4
5
6
7
8
9
10
11
12
13
import time
def now(num):
    mytime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(num))
    return(str(mytime))
num = int(time.time())
sec = num % 60
min = (num // 60) % 60
hour = (num // (60 * 60)) % 24 + 8 # 万恶的东八区!!!!!!!!!!
day = num // (60 * 60 * 24)
print('Time is', now(num))
print('since the epoch, ' + str(day) + ' days ' + str(hour) + ' hours ' + str(min) + ' minutes ' + str(sec) + ' seconds has gone')
# Time is 2020-04-09 15:03:41
# since the epoch, 18361 days 15 hours 3 minutes 41 seconds has gone

2020-04
8

螺旋线

By xrspook @ 20:29:37 归类于: 扮IT

人家要我去学阿基米德螺旋线,但显然我是数学渣,根本领会到不到那些精神,转换不过来,就不要装着能转换。既然习题5说“或者其他种类的螺线”于是我就选择了在我理解范围内的斐波那契螺旋线,也就是黄金螺旋线。人家要我画螺旋线,我觉得要把方框也画出来才容易验证我自己有没有搞错。

为了完成方形和圆弧的两个循环,我笨蛋地把斐波那契数列算了两次……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import turtle, math
def arc(t, r, angle):
    n = 20 # int(2*math.pi*r/4)+3 公式画图太细致太慢,直接赋值加速
    step_length = int(2*math.pi*r)*angle/360/n
    step_angle = angle/n
    t.lt(step_angle/2) # 据说折腾一下角度能消除像素误差?
    polygon(t, step_length, n, step_angle)
    t.rt(step_angle/2)
def polygon(t, length, n, angle):
    for i in range(n):
        t.fd(length)
        t.lt(angle)
def start(t): # 起点要先偏移一些,每次方向保持一致
    t.pu()
    t.home()
    t.goto(160,-110)
def square(t, size): # 第一个正方形
    for i in range(4):
        t.lt(90)
        t.fd(size)                
    t.rt(90)
def boxes(t, n, size): # n-1个正方形
    a = b = 1
    base = size
    for i in range(n-1):
        for i in range(6):
            t.lt(90)
            t.fd(size)
        t.rt(90)
        fibo = a+b # 计算斐波那契数列
        a = b
        b = fibo
        size = base*fibo
def spiral(t, n, size): # 第一个正方形里没有弧线,所以弧线也是n-1
    a = b = 1
    base = size
    for i in range(n-1):
        arc(t, size, 90)        
        fibo = a+b # 在算一次斐波那契数列
        a = b
        b = fibo
        size = base*fibo
bob = turtle.Turtle()
bob.pensize(2) # 笔迹粗点好看些
n = 8
size = 20
start(bob)
square(bob, size)
boxes(bob, n, size)
start(bob)
spiral(bob, n, size)
turtle.mainloop()
2020-04
8

冷静不慌了

By xrspook @ 13:49:05 归类于: 扮IT

昨晚的习题2的花朵让我很郁闷,今天习题3的PIE我沉着冷静了,所以快速完成任务。

参考答案用的不是一个画法,我先画中间的梗,再画外面的框,参考答案是一个接一个三角形画。无论哪个,都逃不掉三角形边长的正弦计算,你叫小学生怎么画!!!两种画法如果设定的内径一样,画出的线条长度是一样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import turtle, math
def pie(t, r, n): # t for turtle, r for radius, n for sides
    angle = 360/n
    for i in range(n):
        bob.fd(r)
        bob.bk(r)
        bob.lt(angle)
    bob.fd(r)
    bob.lt(180-(180-angle)/2)
    for i in range(n):    
        bob.fd(2*math.sin(math.radians(angle/2))*r)
        bob.lt(angle)
    bob.rt(180-(180-angle)/2)
def move(t, length): # t for turle
    t.pu()
    t.fd(length)
    t.pd()
bob = turtle.Turtle()
move(bob, -230)
pie(bob, 100, 5)
move(bob, 120)
pie(bob, 100, 6)
move(bob, 120)
pie(bob, 100, 7)
turtle.mainloop()
© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress