找到可以被1除尽的正整数

记得上小学时,只要是分数计算的场合,老师总是重重的敲着黑板:“先约分,再计算,记住没有?”

再大些,当发现\pi *\pi和9.8(重力加速度)很接近时,感觉自己似乎抓到了世界的真理。

上了大学、工作,依然时不时的被幅频特性方程之类的多项式相除的式子支配。

这两天准备搞一个简易的轮子,需要在程序中计算输入参数上下能被除尽的数。

心情十分激动,计划拿这个问题祭旗,疏解一些几十年被因式分解时不时骚扰的苦闷。

一、编写判断一个数是否能被1除尽的函数。

简单,如果这个数只有因子2和5,再没有其他因子,则该数一定能被1除尽。

def isPure(val:int,divisor1:int,divisor2:int ) -> bool:
    res =False
    divisor=1
    while(1):
        if val%divisor1 ==0:
            divisor=divisor1
        elif val%divisor2 ==0:
            divisor = divisor2
        elif val==1:
            res = True
            break
        else:
            res = False
            break
        val =val//divisor
    return res

调试通过,完美!

二、输出2到10的n次方之间所有能被1除尽的数。

有追求的人,从来不满足于一点点小的成功,看我彻底把你研究明白。嗯!

第一步:找到2到10的n次方的所有能被1除尽的数

第二步:分析从10的n-1次方到n次方之间有多少个数,感受一下数据分析人员的快感。

list1=list() #存储这些数
#百度丑数计算,数组初始化为2,4,5;然后让内部的最后6个数乘以2,4,5,找到比最后一个大的最小3个。插入数组,反复进行。可能会更快。
for i in range(2,1000000+1):
    if isPure(i,2,5):
        list1.append(i) 
N= int(np.log10(list1[-1])+1)
print(list1)

k=0  #list元素序号
kk=1 #段内多少个
for i in range(1,N+1):

    while(1):
        if(k>=len(list1)): break
        if list1[k]>=10**i:
            print(i,kk,list1[k])
            kk=0
            break
        kk =kk+1
        k = k+1

10的6次方,不小了把。额,输出好像有点慢。。。

[2, 4, 5, 8, 10, 16, 20, 25, 32, 40, 50, 64, 80, 100, 125, 128, 160, 200, 250, 256, 320, 400, 500, 512, 625, 640, 800, 1000, 1024, 1250, 1280, 1600, 2000, 2048, 2500, 2560, 3125, 3200, 4000, 4096, 5000, 5120, 6250, 6400, 8000, 8192, 10000, 10240, 12500, 12800, 15625, 16000, 16384, 20000, 20480, 25000, 25600, 31250, 32000, 32768, 40000, 40960, 50000, 51200, 62500, 64000, 65536, 78125, 80000, 81920, 100000, 102400, 125000, 128000, 131072, 156250, 160000, 163840, 200000, 204800, 250000, 256000, 262144, 312500, 320000, 327680, 390625, 400000, 409600, 500000, 512000, 524288, 625000, 640000, 655360, 781250, 800000, 819200, 1000000]
1 5 10
2 9 100
3 14 1000
4 19 10000
5 24 100000
6 28 1000000

0-10 是5个,刚开始,有点特殊;2到5,多好,每次加5,完美;为啥5到6是加4啊?

用7试试?

等等。。等等。。。

1 5 10
2 9 100
3 14 1000
4 19 10000
5 24 100000
6 28 1000000
7 34 10000000

加了6,用8试试

等等。。等等。。。等等。。。。等等。。。。。等等。。。。。。

1 5 10
2 9 100
3 14 1000
4 19 10000
5 24 100000
6 28 1000000
7 34 10000000
8 38 100000000
9 42 1000000000

what?难道平均加5?

why?中间加4和加6又是咋回事?程序好慢啊,有啥办法可以把算法加速一些啊,数学和编程果然不适合我!!!

???我轮子去哪里了????

.......

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

健忘的松鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值