行走的数字

一、前言

有一定数学基础的同学们都知道,如果两个正整数相除之后得到的结果,要么能除尽,要么就是一个循环小数。
假如结果是循环小数,那么小数的每一位取值是0-9,且存在循环节点。如果我们用小数的每一位进行画图,每位小数用固定的线段表示,而每位小数的大小则用角度(1代表36度,2代表72度,以此类推)表示,这样的话我们就可以看到画图板上有一条线段在行走一样。
示例:
1/7=0.142857142857142857…
第1位小数是1,则画一条长度固定,角度为72°的线段,接着第2位小数是4,在原线段基础上画一条长度固定,角度为144°的线段,依次类推,就会形成如下图案:
image

只要是循环小数,最后都会形成一个对称的图形。如上图,感觉还是挺好看的。或许这就是数学之美吧~

二、准备

2.1 用到的库

decimal:高精度库,可以用来计算更高精度的小数。
turtle:大名鼎鼎的海龟画图库,用来画图。

2.2 原理介绍

1、使用高精度库计算2个数字相除之后的结果,最好精确到200位以上。
2、编写一个函数,用来求第一步结果的小数部分并做处理,求到这个小数的固定部分及循环位数。例如:1/12=0.08333333,那么固定部分就是:08,循环部分就是:3。
3、为了能用尽量少的画笔画成最终的图形(形成对称),我们需要用固定部分+循环部分*10的小数位来进行画图。

三、实例

3.1 完整代码

# Encoding: utf-8
# Author: 思必得
# Date: 2021-09-29 14:21
# Project name: FrbPythonFiles
# IDE: PyCharm
# File name: walknumber

# 模块说明:
"""
"""
# 更新日志:
"""
1、2021-09-29:
    a、完成初版
"""
# 待修改:
"""
"""


def 求两个数相除之后的小数部分的循环小数(p_dividend: int, p_divisor: int, p_prec: int = 500):
    """
    求两个整数相除之后的小数部分的循环小数,包括4部分:固定部分 + 循环部分 + 固定部分的长度 + 循环部分的长度
    比如1/7=0.142857142857142857142857142857,那么最后返回:('', '142857', 0, 6)
    @param p_dividend: 被除数
    @param p_divisor: 除数
    @param p_prec: 小数的精确度(精确到多少位)
    @return: {tuple:固定部分 + 循环部分 + 固定部分的长度 + 循环部分的长度}
    @author: 思必得
    @note:调用示例:
    (1, 95)     ('0', '105263157894736842', 1, 18)
    (1, 97)     ('', '010309278350515463917525773195876288659793814432989690721649484536082474226804123711340206185567', 0, 96)
    (1, 193)    循环部分的长度:192位
(1, 479)    循环部分的长度:239位
(1, 384)    固定部分的长度:7位
    """
    from decimal import getcontext, Decimal
    getcontext().prec = p_prec  # 设置精度

    if p_dividend % p_divisor == 0:  # 整除的情况
        return None
    _shang_str = str(Decimal(p_dividend) / Decimal(p_divisor))
    _index = _shang_str.find('.')
    _str_digits = _shang_str[_index + 1:]
    _len_digits = len(_str_digits)
    if len(_shang_str) - 1 < p_prec:  # 非循环小数
        return None

    _half = _len_digits // 2
    for i in range(_half):
        for j in range(1, _half - i):
            _ratio = (_len_digits - i) // j
            _lt = _str_digits[slice(i)] + _str_digits[slice(i, i + j)] * _ratio
            _lt = _lt + _str_digits[slice(i, i + j)][slice(_len_digits - len(_lt))]
            if _lt[:-1] == _str_digits[:-1]:
                _fix = _str_digits[slice(0, i)]
                _loop = _str_digits[slice(i, i + j)]
                return _fix, _loop, len(_fix), len(_loop)


if __name__ == '__main__':
    import turtle as tt

    if s := 求两个数相除之后的小数部分的循环小数(1, 13):
        ss = s[0] + s[1] * 10
        print(s)
        print(ss, len(ss))
        tt.setup(width=1.0, height=1.0)
        pen = tt.Pen()
        for i in ss:
            pen.left(int(i) * 36)
            pen.forward(100)
        tt.exitonclick()
    else:
        print('无法作图,结果不是循环小数')

3.2 一些结果

3.2.1 1/11

('', '09', 0, 2)

image

3.2.2 1/13

('', '076923', 0, 6)

image

3.2.3 1/17

('', '0588235294117647', 0, 16)

image

3.2.4 1/19

('', '052631578947368421', 0, 18)

image

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:行走的数字 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • 类属性和对象属性

    6.3 类属性和对象属性 在类定义中,属性按照归属分为对象属性、类属性。按照调用的私密性分为一般属性和私有属性。 6.3.1 类属性和对象属性 对象属性是最常用到的一种属性。即使我们对上面的类:MyClass1实例化了一个mc的对象,mc对象也不能进行有实质的操作。因为mc对象的类:MyClass1中既没有定义属性也没有定义方法。在定义类时还能定义类属性。接…

    Python开发 2023年3月31日
    00
  • 数据类型前置知识

    4.1 数据类型前置知识 4.1.1 数据类型的概念 顾名思义,数据类型就是指数据的类型,计算机不像人,能够很好的分辨数据类型,比如10086,计算机就不知道这个数据到底是字符串还是数值。计算机在用这个数据进行计算时就会出现问题。为了避免这种情况,需要对数据贴一个标签,这个标签就是类型。告诉计算机遇到这种数据应该怎么处理。 4.1.2 哈希 哈希(Hash)…

    Python开发 2023年4月2日
    00
  • 类和类的定义

    6.2 类和类的定义 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如学生类,而实例是根据类创建出来的一个个具体的对象,每个对象都拥有相同的方法,但各自的数据可能不同。 6.2.1 什么是类 当你在马路上看到一辆飞驰的奥迪汽车时,这辆奥迪车就是汽车类的一个实例。汽车就是一个类,每辆车都是汽车类的一个实例。可以将…

    Python开发 2023年3月31日
    00
  • Python函数

    5.1 函数相关基础概念 5.1.1 函数是什么 函数是指一段可以直接被另一段程序或代码引用的程序或代码。也叫做子程序、(OOP中)方法。一个较大的程序一般应分为若干个程序块,每一个模块用来实现一个特定的功能。所有的高级语言中都有子程序这个概念,用子程序实现模块的功能。在程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用。开发者要善于利用函…

    Python开发 2023年4月2日
    00
  • 使用pip管理库

    2.5 使用pip管理库 安装Python后会默认安装pip工具,该工具可以用来安装、升级和移除库。默认情况下 pip 将从[Python Package Index]https://pypi.org 处下载安装软件包。pip 有许多子命令: “install”, “uninstall”, “freeze” 等等。下面我们来介绍一些比较重要且实用的pip命令…

    Python开发 2023年4月2日
    00
  • Python变量

    4.10 Python变量 4.10.1 变量介绍 变量,顾名思义,就是可以变化的量。变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python中,变量就是变量,它没有类型,我们所说的类型是变量所指的内存…

    Python开发 2023年4月2日
    00
  • 常用库

    2.4 常用库 2.4.1 time 时间的访问和转换 该模块提供了各种与时间相关的函数。相关功能还可以参阅 datetime 和 calendar 模块。 2.4.2 datetime 基本日期和时间类型 datetime 模块提供用于处理日期和时间的类。 2.4.3 calendar 日历相关函数 这个模块让你可以输出像 Unix cal 那样的日历,它…

    Python开发 2023年4月2日
    00
  • 类相关函数(反射机制)

    6.5 类相关函数(反射机制) 在 Python 中使用反射可以得到对象的属性,即:反过来让对象告诉我们他的相关信息是什么,用于实现在运行时获取对象的相关信息。Python中有几个内置方法,可以用来检查或是访问对象的属性。这些方法可以用于任意对象。 6.5.1 dir([obj]) 描述不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参…

    Python开发 2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部