所以我遇到了这个问题:

从1到1000有多少个数字不能被数字2,3和5整除?

起初看起来很简单,所以我写了一个快速的python程序来解决它:

count = 0
for number in range(1,1000):
    if number % 2 != 0 and number % 3 != 0 and number % 5 != 0:
        count += 1
print(count)

我得到了正确的答案(266),但我认为如果我想检查的不仅仅是3个值,那么这样做是很多打字.我也想做一个数学解决方案所以我遇到了这个:

1000 – ((1000/2 1000/3 1000/5) – (1000 / 2×3 1000 / 2×5 1000 / 3×5)(1000 / 2x3x5))= 1000 – ((500 333 200) – (166 100 66)33)= 1000- 734 = 266

我认为这是一个很好的方法,所以我在代码中实现它:

def foo(ln = 1000),numbers = [2,3,5]:
    div = 0
    muldiv = 0
    totdiv = 1


    for n in numbers:
        div += ln/n
    for i in numbers:
        for n in range(numbers.index(i)+1,len(numbers)):
            muldiv += ln/(i * numbers[n])

    for n in numbers:
        totdiv *= n

    answer = ln - (div - muldiv + ln/totdiv)
    print("answer is ",math.floor(answer))

现在我很确定我在第二个函数中搞砸了,因为它似乎不适用于更多数字.例如,如果我试图找到

从1到1000有多少个数字不能被数字2,5和7整除?

第一个方法返回228并且foo(数字= [2,5,7])返回300 …我很确定228是正确答案,因为再多一个数字意味着有更多因素而不是更多,但是我哪里出错了?有没有更好的方法来解决这个问题?

解决方法

你不需要算法,简单的数学就足够了:

假设你想要计算从1到N(包括)的数字量,可以用k分割,这相当于:

地板(N / K).

因此,在这种情况下可分为3的数字是333.

然而,现在你不能简单地使用计算可分为2,3和5的数字的数量;并总结,因为有共同点.确实:例如,15和3都可以分割.

您可以使用inclusion-exclusion principle解决此问题:

可分为2,3和5的数字量相同

>可分数为2的金额
>加上可分数为3的数字
>加上可分数为5的数字
>减去可分为2和3的数字量
>减去可分为2和5的数字量
>减去可分为3和5的数字量
>加上可分为2,3和5的数字.

所以为了解决你的第一个问题,你可以简单地说:

def n_div(N,k):
    return N//k

def n_div235(N):
    return n_div(N,2)+n_div(N,3)+n_div(N,5)-n_div(N,2*3)-n_div(N,2*5)-n_div(N,3*5)+n_div(N,2*3*5)

def not_div235(N):
    return N-n_div235(N)

如您所见,它会生成正确的结果:

>>> not_div235(1000)
266

只要N与除数的数量相比非常大,您最好使用包含 – 排除方法:

你可以这样做:

import itertools
from functools import reduce
import operator

def gcd(a,b):
    while b:      
        a,b = b,a % b
    return a

def lcm(a,b):
    return a * b // gcd(a,b)

def lcm_list(ks):
    res = 1
    for k in ks:
        res = lcm(res,k)
    return res

def n_div_gen(N,ks):
    nk = len(ks)
    sum = 0
    factor = 1
    for i in range(1,nk+1):
        subsum = 0
        for comb in itertools.combinations(ks,i):
            subsum += n_div(N,lcm_list(comb))
        sum += factor * subsum
        factor = -factor
    return sum

def not_div_gen(N,ks):
    return N-n_div_gen(N,ks)

对于小N,这不会得到回报,但是想要计算可分为3,5和7从1到1 000 000 000的数字的数量是:

>>> not_div_gen(1000000000,[3,7])
457142857

你可以这样做:

>>> sum(i%3!=0 and i%5!=0 and i%7!=0 for i in range(1,1000000001))
457142857

但是计算它需要几分钟,而我们自己的方法使用毫秒.请注意,这仅适用于巨大的N.

python – 解决这个难题的最佳算法是什么?的更多相关文章

  1. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

  2. Swift中的列表解析

    在Swift中完成这个的最简单的方法是什么?我在寻找类似的东西:从Swift2.x开始,有一些与你的Python样式列表解析相当的东西。(在这个意义上,它更像是Python的xrange。如果你想保持集合懒惰一路通过,只是这样说:与Python中的列表解析语法不同,Swift中的这些操作遵循与其他操作相同的语法。

  3. 可以选择()与Windows下的Python文件一起使用吗?

    我试图在Windows下运行以下python服务器:我收到错误消息(10038,’尝试对非套接字的操作’).这可能与python文档中的theremark有关,“Windows上的文件对象是不可接受的,但套接字是.在Windows上,底层的select()函数由WinSock库提供,并且不处理不具有的文件描述符来自WinSock.“在互联网上有很多关于这个主题的帖子,但它们对我来说太技术或者根本不

  4. Windows上的Python多处理RuntimeError

    我有一个类函数(让我们称之为“alpha.py”),它使用多处理(processes=2)来分叉一个进程,并且是我编写的Python包的一部分.在一个单独的Python脚本中(我们称之为“beta.py”),我从这个类中实例化了一个对象并调用了使用多处理的相应函数.最后,所有这些都包含在一个包装Python脚本(让我们称之为“gamma.py”)中,它处理许多不同的类对象和函数.实质上:>从命令行

  5. 如何在没有pywin32的情况下使用python确定Windows上的文件所有者

    我正在编写一个脚本,需要确定Windows上文件所有者的用户名.虽然我发现了asolutionusingpywin32,但我对使用它犹豫不决,因为我不想添加模块依赖.该脚本将为python2.6编写,并且必须在32位和64位平台上运行.我想知道是否有不同的方法,可能有ctypes,来确定这些信息下面使用ctypes调用GetNamedSecurityInfo.最初它跟随问题中链接的codesnip

  6. 通过PHP代码打印Python输出

    您可以添加一点sleep,以免超载您的服务器.如果您正在使用网页,您可以使用AJAX定期重新加载页面的相关部分.希望这可以帮助你.

  7. CentOS6.5安装python2.7.9

    以前一直用ubantu下的python,ubantu比较卡。centos6.5安装pip1.5.5第一步:下载pip1.5.5并解压[root@spark1usr]#wget--no-check-certificatehttps://github.com/pypa/pip/archive/1.5.5.tar.gz[root@spark1usr]#chmodu+x1.5.5[root@spark1usr]#tar-zxvf1.5.5[root@spark1usr]#cdpip-1.5.5第三步:安装pip[

  8. Centos6安装TensorFlow及TensorFlowOnSpark

    编译并安装Python:安装Pip:安装TensorFlow:在安装TensorFlow的时候会自动安装诸如numpy等常用Python包;安装TensorFlowOnSpark:把“武装”好的Python打包并上传到HDFS:现在就可以使用TensorFlow了;7.修改TensorFlow代码,比如下面的TensorFlow代码是可以在TensorFlow环境中运行的:其中iris01.csv数据如下:那代码怎么修改呢?

  9. php的strtr for python

    PHP具有strtr功能:它将字符串中的字典键替换为相应的值,并且(重要)不替换已替换的字符串.一个天真的尝试在python中编写相同的东西:返回xz-x-y,这不是我们想要的.如何更改上面的函数,使其行为像它的PHP对应?

  10. Centos 6.8升级Python2.6.6至2.7.8

    由于之前用Python2.7版本写了一个脚本,移植到新的环境之后,由于CentOS自带的Python版本较低,有些函数执行出错。本文介绍CentOS6.8从自带的Pyhon版本是2.6.6升级到2.7.8的方法。因为CentOS系统中旧版本的Python已被深度依赖,所以不能卸载原有的Python,只能全新安装。/usr/bin/python修改为系统原有的python版本地址#!

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部