将正整数表示为三个数字的总和

如何解决将正整数表示为三个数字的总和

可以用多少种方式将正整数n表示为三个不同正整数之和。如果一个方法包含一个数字,而另一个方法则没有,那么这两种方法是不同的。

我设法获得了以下脚本,以将写n的方式的数量计为三个数字的总和,但这并没有考虑其他条件。

def nways(n):  
  
    if (n <= 2):  
        return False
    else:           
        ways = (n - 1) * (n - 2) / 2
          
    return ways

例如,如果n = 8,则我需要返回2,因为1 + 2 + 5 = 8和1 + 3 + 4 = 8,但是当前函数返回21 ...

背后的正确算法和数学是什么?

解决方法

解决方案

def nways(n):
    nways = 0
    for i in range(1,n-2):
        min_j,max_j = i+1,(n-i-1)//2
        nways += (max_j - min_j + 1) if max_j >= min_j else 0
    return nways

此算法消耗O(N)时间和O(1)空间。

说明

让我们将三个正数表示为ijk

由于它们都是不同的,因此这三个数字必须彼此大于或小于。我们假设最小的数字为i,中间的数字为j,最大的数字为k。因此关系将为i < j < k

n = 18为例

  • 我们从i = 1开始,然后j + k应该是17
    • 因此(j,k)可能从(2,12)(3,14),...到(8,9)
    • 通知(j,k)不能为(9,8)(10,7),因为j<k
    • 因此,min_j将是i+1(在这种情况下为2),max_j将是(n-i-1)//2(在这种情况下为8
    • (j,k)组合的数量为max_j - min_j + 1,在这种情况下为7
  • 我们继续i = 2,然后将j + k设为16
    • min_j将是i+1(在这种情况下为3),max_j将是(n-i-1)//2(在这种情况下为7
    • (j,k)组合的数量为max_j - min_j + 1,在这种情况下为5

我们尝试i的所有可能值,然后将(j,k)对的所有组合加起来,然后得出答案。

,

您可以使用蛮力,还有更多工作:

  • 检查三个术语是否不同
  • 存储一组唯一的条款
  • 那套衣服的长度就是你的结果
sourcetype

演示:https://repl.it/repls/ChocolateHelplessLivecd

,

一种非常不同的方法是使用约束求解器。这是一个示例:

import constraint as con

n = 8

p = con.Problem()
p.addVariables(['x','y','z'],range(1,n-2))
p.addConstraint(con.ExactSumConstraint(n))
p.addConstraint(lambda a,b,c : a < b < c,("x","y","z"))
sols = p.getSolutions()

print(len(sols))
sols

这给出了:

2
[{'x': 1,'y': 3,'z': 4},{'x': 1,'y': 2,'z': 5}]

我不知道预测溶液数量的简单公式。

,

您可以对@ hgb123已经很好的答案进行一些相当重要的优化,使其仍然使用蛮力,但是要更加聪明:

def ways(n):
  tuple_sum_set = set()

  for i in range(1,n-2):
    for j in range(i+1,n-2):
      for k in range(j+1,n-2):
        if i + j + k == n:
          tuple_sum_set.add((i,j,k))

  print(tuple_sum_set)
  return len(tuple_sum_set)

(如果您对此答案进行投票,请同时对@ hgb123的投票进行投票,因为这是他的答案的衍生形式)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res