按词汇顺序查找总和为给定数字的千组

2023-12-08

较大的数字可以采用逗号格式,以便更容易地分为三个一组。例如。1050 = 1,050 and 10200 = 10,200.

每三组的总和为:

1050=1,050 gives: 1+50=51

10200=10,200 gives: 10+200=210

我需要在三人组的总和中搜索匹配项。 也就是说,如果我正在寻找1234,然后我正在寻找三元之和的数字= 1234.

最小的匹配是235,999 since 235+999=1234。没有其他整数小于235,999给出三的和等于 1234.

下一个最小的匹配是236,998 since 236+998=1234。 每次都可以加 999,但在达到 999 后就失败了,因为 999 溢出,所以在数字上多加了一位 1。

更一般地说,我要求解决方案(从最小到最高):

a+b+c+d…=x

其中 a,b,c,d… 是 0-999 和 x 之间的任意整数 是一个固定整数

请注意,对于任何正整数 x,都有无限个解。

如何从最小数量的解决方案开始获得这一问题的解决方案(对于 y 个解决方案,其中 y 可以是任意大的数字)?

有没有一种方法可以做到这一点,而不用暴力一一循环?我正在处理可能非常大的数字,这可能需要数年时间才能直接循环。理想情况下,人们应该在没有失败的尝试的情况下做到这一点。


如果您一次只考虑 1 位数字,而不是 3 位数字组,那么这个问题就更容易思考。

算法:

  • 首先用 x 填充 0 数字组。

  • 创建一个循环,每次打印下一个解决方案。

    • 通过将所有过大的值从右侧移动到左侧,仅将最大值保留在右侧,对组进行“标准化”。
    • 输出解决方案
    • Repeat:
      • 倒数第二组加1
      • 如果组太大(例如 999+1 太大),则可以向左进位
      • 检查结果是否没有变得太大(a[0]应该能够吸收添加的内容)
      • 如果结果太大,请将组设置为零并继续增加较早的组
    • 计算最后一组吸收盈余(可以是正数或负数)

一些用于说明的 Python 代码:

x = 1234
grouping = 3
max_iterations = 200
max_in_group = 10**grouping - 1

a = [x]

while max_iterations > 0:
    #step 1: while a[0] is too large: redistribute to the left
    i = 0
    while a[i] > max_in_group:
        if i == len(a) - 1:
            a.append(0)
        a[i + 1] += a[i] - max_in_group
        a[i] = max_in_group
        i += 1

    num = sum(10**(grouping*i) * a[i] for i, n in enumerate(a))
    print(f"{num}  {num:,}")
    # print("".join([str(t) for t in a[::-1]]), ",".join([str(t) for t in a[::-1]]))

    # step 2:  add one to the penultimate group, while group already full: set to 0 and increment the
    #   group left of it;
    #   while the surplus is too large (because a[0] is too small) repeat the incrementing
    i0 = 1
    surplus = 0
    while True:  # needs to be executed at least once, and repeated if the surplus became too large
        i = i0
        while True:  # increment a[i] by 1, which can carry to the left
            if i == len(a):
                a.append(1)
                surplus += 1
                break
            else:
                if a[i] == max_in_group:
                    a[i] = 0
                    surplus -= max_in_group
                    i += 1
                else:
                    a[i] += 1
                    surplus += 1
                    break
        if a[0] >= surplus:
            break
        else:
            surplus -= a[i0]
            a[i0] = 0
            i0 += 1

    #step 3: a[0] should absorb the surplus created in step 1, although a[0] can get out of bounds
    a[0] -= surplus
    surplus = 0
    max_iterations -= 1

缩写输出:

235,999 236,998 ... 998,236 999,235 ... 1,234,999 1,235,998 ... 1,998,235 1,999,234 2,233,999 2,234,998 ... 

输出为grouping=3 and x=3456:

459,999,999,999 460,998,999,999 460,999,998,999 460,999,999,998 461,997,999,999
461,998,998,999 461,998,999,998 461,999,997,999 461,999,998,998 461,999,999,997
462,996,999,999 ...

输出为grouping=1 and x=16:

79 88 97 169 178 187 196 259 268 277 286 295 349 358 367 376 385 394 439 448 457 466
475 484 493 529 538 547 556 565 574 583 592 619 628 637 646 655 664 673 682 691 709
718 727 736 745 754 763 772 781 790 808 817 826 835 844 853 862 871 880 907 916 925
934 943 952 961 970 1069 1078 1087 1096 1159 1168 1177 1186 1195 1249 1258 1267 1276
1285 1294 1339 1348 1357 1366 1375 1384 1393 1429 1438 1447 1456 1465 1474 1483 1492
1519 1528 1537 1546 1555 1564 1573 1582 1591 1609 1618 1627 1636 1645 1654 1663 1672
1681 1690 1708 1717 1726 1735 1744 1753 1762 1771 1780 1807 1816 1825 1834 1843 1852
1861 1870 1906 1915 1924 1933 1942 1951 1960 2059 2068 2077 2086 2095 2149 2158 2167
2176 2185 2194 2239 2248 2257 2266 2275 2284 2293 2329 2338 2347 2356 2365 2374 2383
2392 2419 2428 2437 2446 2455 2464 2473 2482 2491 2509 2518 2527 2536 2545 2554 2563
2572 2581 2590 2608 2617 2626 2635 2644 2653 2662 2671 2680 2707 2716 2725 2734 ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按词汇顺序查找总和为给定数字的千组 的相关文章

  • 将所有 BigDecimal 运算设置为特定精度?

    我的Java程序以高精度计算为中心 需要精确到至少120位小数 因此 程序中所有非整数都将由 BigDecimal 表示 显然 我需要指定 BigDecimal 的舍入精度 以避免无限小数表达式等 目前 我发现必须在 BigDecimal
  • 在现代 x86-64 上计算 64 位整数的整数 Log10 的最快方法是什么?

    标题 我找到了大量 32 位示例 但没有找到完整的 64 位示例 使用这个帖子 https codegolf stackexchange com questions 47290 fastest way to compute order of
  • 如何使用NSDecimalNumber?

    我正在构建一个需要对金钱进行计算的应用程序 我想知道如何正确使用 NSDecimalNumber 特别是如何从整数 浮点数和双精度数初始化它 我只发现它很容易使用 decimalNumberWithString 方法 这 initWith
  • 几何:找到两点之间特定距离的点

    这类似于这个问题 https stackoverflow com questions 328107 how can you determine a point is between two other points on a line se
  • TCPDF/PHP 和字体:大写数字(血统数字?旧样式?)

    我得到了一种特殊的字体 上面有这样的数字 例如 正如您在 3 上看到的 一些数字下降到基线以下 我想要实现的是 这些数字不会低于该线 并且看起来像这样 在 Word 中 可以在相同字体的字符设置中轻松设置 如何在 TCPDF 中呈现数字 我
  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • 为什么 Convert.ToInt32(1.0/0.00004) != (Int32)(1.0/0.00004)

    为什么这段代码http ideone com YRcICG http ideone com YRcICG void Main double a 0 00004 Int32 castToInt Int32 1 0 a Int32 conver
  • 如何在编程中表示sqrt(-1)?

    我想代表sqrt 1 在C 中 因为我正在尝试实现FFT算法 有没有好的方法来表示这一点 我猜你正在寻找 include
  • BODMAS系统的加法和减法

    我一直在构建一个简单的公式计算器 但一直被加法和减法困扰 正如您应该知道的 在计算方程时 您遵循优先级算术规则 即括号 顺序 幂函数 除法 乘法 加法和减法 问题是加法和减法具有相同的优先级 因此您可以从左到右阅读 到目前为止 这是我的代码
  • 为什么斐波那契堆被称为斐波那契堆?

    The 斐波那契堆 http en wikipedia org wiki Fibonacci heap数据结构的名称中有 斐波那契 一词 但数据结构中似乎没有任何内容使用斐波那契数 根据维基百科文章 斐波那契堆的名称来自于运行时间分析中使用
  • 转换 google.maps.Point 中的 (x, y) 像素坐标

    我试图根据我的 x y 像素坐标 当然还有地图选项 例如缩放和中心 找出 LatLng 为了做到这一点 我发布了另一个question https stackoverflow com questions 25219346 how to co
  • 最小对的总和

    Given 2N点 in a 2D plane 你必须将它们分组为N pairs使得所有对的点之间的距离的总和是最小可能值 所需的输出只是总和 换句话说 如果a1 a2 an分别是第一对 第二对 和第 n 对点之间的距离 则 a1 a2 a
  • 有没有对数字(千)进行分组的函数?

    小 模块中是否隐藏着一个函数 它为我执行此操作 my var 23654325432 var reverse var var s d 3 K d g var reverse var I like 数字 格式 http search cpan
  • 使用矩阵代数来操作字符串:可行吗?

    我正在尝试使用矩阵代数来操作字符串 这意味着能够使用字符串或字符串数 组的串联和粘贴来实现多个类似矩阵的结构 我之前尝试在 R 上实现这个东西 但这是不可能的 因为矩阵只能有一维条目 我希望足够的与语言无关和抽象 但为了清楚起见 我将使用类
  • 计算 Adamic-Adar 的快速算法

    我正在研究图形分析 我想计算一个 N N 相似度矩阵 其中包含每两个顶点之间的 Adamic Adar 相似度 为了概述 Adamic Adar 让我从以下介绍开始 给定邻接矩阵A无向图的G CN是两个顶点的所有公共邻居的集合x y 两个顶
  • 处理小数字和准确性

    我有一个程序 可以处理很多非常小的数字 接近双极限的下限 在我的应用程序执行期间 其中一些数字逐渐变小 这意味着它们的 估计 不太准确 我目前的解决方案是在进行任何计算之前将它们放大 然后再次缩小 但这让我思考 这样做是否真的获得了更多的
  • 将大数字转换为字母(然后再转换回来)

    是否有一个术语来描述将大数字存储为字母的想法 例如 假设我有 相对较小的 数字 138201162401719 并且我想将字符数缩小到尽可能少的字符数 我知道这无助于节省磁盘空间 英文字母表中有 26 个字母 但我将它们算作 25 个 因为
  • 计算二维笛卡尔坐标中不规则形状的边界

    我正在寻找一种计算不规则形状边界的解决方案 Lats take a look at Square example 如果我有Minimum x and y and Maximum x and y like MaxX 5 MinX 1 MaxY
  • 解释 Vinay Deolalikar 的证明 P != NP [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 最近有一个paper https www win tue nl gwoegi P versus NP Deolalikar pdf惠普实验
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679

随机推荐

  • 如何最好地实现自定义类型的 Equals?

    假设有一个 Point2 类 并且以下等于 public override bool Equals object obj public bool Equals Point2 obj 这是 Effective C 3 中所示的内容 publi
  • ASP 奇怪的未指定错误 - 80004005

    我必须在一个已经制作好的网站上工作 只需添加一些小模块 当我更新时 不同的子文件夹中有许多名为 myDB mdb 的文件 我想确保我的应用程序连接正确的数据库 所以我开始重命名子文件夹 在其中一个子文件夹中 我刷新了 主站点和我的停止工作
  • Zend Framework 2 过滤/验证内容数组

    如何将过滤器应用于包含数组内容的字段元素 例如 this gt add name gt tags type gt text filter gt array array name gt StripTags array name gt Stri
  • 如何将值从一个 JLabel 传输到另一个 JLabel?

    我有这个计算器 但我不知道如何获取其中的值resultpane单击 完成 按钮时到第一个文本框 我是 Java 新手 我已经尝试这样做 但我一直收到错误 import java awt BorderLayout import java aw
  • My SQL 错误:连接尝试失败,因为连接方未正确响应

    我在第三方服务器中有一个 MySQL 数据库 我正在尝试使用 Dreamweaver 中的 PHP 从本地计算机访问它 但是 我收到以下错误 MySQL 错误 2002 连接尝试失败 因为连接方未正确响应 一段时间后 或建立连接失败 因为连
  • 如何在 XSL 中用空格替换逗号

    我需要在 XML 输出中将所有其他逗号替换为空格 现在 我的纬度和经度如下所示 0 52437106918239 0 391509433962264 0 533805031446541 0 430817610062893 0 0 54795
  • 使用 PackageManager 不会在 Android 11 上填充应用列表

    我正在使用包管理器来获取启动器中应用程序抽屉界面的应用程序列表 一切正常 但在 Android 11 上 唯一显示的应用程序是 Android 设置应用程序 是什么改变了它不再工作和 或我应该做什么才能使它工作 应用程序列表现在基于用户配置
  • 从 pandas DataFrame 中的日期时间列中提取月份

    我有一个从 Excel 读取的 DataFrame 其中包含 DateTime 类型的列之一 sales data pandas read excel r Sample Sales Data xlsx 我能够使用 str extract l
  • 将列向量转换为 R 中矩阵的对角线?

    我在 R 中有一个具有以下格式的列向量 num 1 2464 1 我想对向量进行对角线排列 因此每个元素都位于矩阵的对角线中 我尝试过以下代码 diagvector lt diag myvector 但随后它只显示第一个数字 我想我只能使用
  • 使用不同节点运行 SKActions 序列

    我知道我可以创建一个 SKAction sequence 它将一一运行一个节点的操作 但是 如果我想用不同的节点执行序列 我该怎么做呢 我想做这样的事情 从节点 A 运行操作 等待 2 秒 从节点 B 运行操作 如果两个节点的名称是唯一的并
  • DestroyWindow 不会使用 Python 和 OpenCV 关闭 Mac 上的窗口

    我的程序使用以下代码生成一系列窗口 def display img name fun global clicked cv NamedWindow name 1 cv ShowImage name img cv SetMouseCallbac
  • z3 对于没有量词的断言生成未知

    我有一些简单的约束 涉及 z3 中实数的乘法 这些约束产生unknown 问题似乎是它们被包装在数据类型中 因为未包装的版本会产生sat 这是一个简化的情况 declare datatypes T NUM n Real declare co
  • 限制可以上传的文件数量

    如何限制可以上传的文件数量 The max验证似乎适用于图像的大小 以千字节为单位 如何验证允许上传的最大文件数 例如 单个输入只能上传 10 个文件 我在 Laravel 7 x 中的表现如何 使用以下命令创建一个新的表单请求类 php
  • 需要替代的 Python 列表反向解决方案

    我今天参加了一个工作面试 在此期间 我被要求写下一个反转列表的算法 首先我使用reverse 方法提供了答案 x 1 2 3 4 5 y reversed x for i in y print i 进行面试的高级开发人员问我是否知道另一种方
  • 如何在 C# 中以编程方式将 xlsx 文件转换为 2003 xls 文件?

    我找到了Excel包 一个比 Excel Interop API 更好的库 用于以编程方式创建和维护 Excel 工作表 但它们是在 xlsx 中生成的 大多数看到这些文件的人只安装了 Office 2003 因此我需要在我的 C 代码中将
  • 如何将“Mon Jun 18 00:00:00 IST 2012”转换为 18/06/2012?

    我有一个像下面这样的值Mon Jun 18 00 00 00 IST 2012我想将其转换为18 06 2012 如何转换这个 我尝试过这个方法 public String toDate Date date SimpleDateFormat
  • 上传到 FTP 时保留图像创建日期

    因此 我正在为我的家人制作一个网站 我们可以在其中上传图像并查看它们 但该网站的一个重要功能是按日期排序 以便例如我的阿姨在我母亲的生日时拍了照片 而我也有拍摄照片 我们上传图像 它们将添加到同一相册等 我意识到通过浏览器上传时无法保留日期
  • jqGrid - 在网格中不提供数据消息?

    如果当前搜索没有返回数据 我们将使用loadComplete回调向用户打印一条消息 表明没有数据 有没有办法配置 jqGrid 以在网格内打印出 无数据 消息 目前我们将其打印在div在网格上方 但希望它位于实际网格内 jqGrid 显示
  • Apache AGE-如何实现两个图之间的关系

    如果我们有 2 个图数据库 A 和 B 并且当前节点 A 图数据库和 B 图数据库之间没有关系 现在我必须在 A 节点和 B 节点之间添加关系 那么如何我使用 AGE 来做到这一点 例如 A 可以是员工图数据库 B 可以是任何汽车经销商图数
  • 按词汇顺序查找总和为给定数字的千组

    较大的数字可以采用逗号格式 以便更容易地分为三个一组 例如 1050 1 050 and 10200 10 200 每三组的总和为 1050 1 050 gives 1 50 51 10200 10 200 gives 10 200 210