精易论坛

标题: 易语言遍历数 [打印本页]

作者: ye347549299    时间: 2025-2-25 04:28
标题: 易语言遍历数
举个例子  把40分成5份  但是5份只能 在1~10中的取        例如   正确:5+5+10+10+10  =40  [5-5-10-10-10]    1+9+10+10+10=40  [1-9-10-10-10]   5+7+9+9+10=40 [5-7-9-9-10]  

错误:5+7+5+11+12=40 [5-7-5-11-12]   这种不需要的 因为 不在1~10里

把所有正确的例子遍历出来   例如这种[5-7-9-9-10]

最好也可以 把 30分成4份这样的遍历的算法

作者: samll88    时间: 2025-2-25 04:28
  
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
a整数型5
i整数型 
计次循环首 (1000, )
置随机数种子 ()
计次循环首 (5, i)
a [i]取随机数 (5, 10)
计次循环尾 ()
a [5] = 40 - a [1] - a [2] - a [3] - a [4]
调试输出 (到文本 (a [1])“+”到文本 (a [2])“+”到文本 (a [3])“+”到文本 (a [4])“+”到文本 (a [5])“=”到文本 (40))
延迟 (100)
计次循环尾 ()


i支持库列表   支持库注释   
spec特殊功能支持库





补充内容 (2025-2-25 07:21):
写错了,看下面
作者: samll88    时间: 2025-2-25 07:20
  
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
a整数型5
i整数型 
计次循环首 (1000, )
置随机数种子 ()
计次循环首 (5, i)
a [i]取随机数 (5, 10)
计次循环尾 ()
a [5] = 40 - a [1] - a [2] - a [3] - a [4]
如果真 (a [5] ≤ 10)
调试输出 (到文本 (a [1])“+”到文本 (a [2])“+”到文本 (a [3])“+”到文本 (a [4])“+”到文本 (a [5])“=”到文本 (40))
延迟 (100)

计次循环尾 ()
刚才也错了,改下


i支持库列表   支持库注释   
spec特殊功能支持库



作者: xiguapihenpi    时间: 2025-2-25 07:35
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
组合数组文本型0
寻找组合 (5, 40, 组合数组)  ' 查找40分5份的组合
输出调试文本 (“40分5份:”)
调试输出 (组合数组)
清除数组 (组合数组)
寻找组合 (4, 30, 组合数组)  ' 查找30分4份的组合
输出调试文本 (“30分4份:”)
调试输出 (组合数组)
子程序名返回值类型公开备 注
寻找组合整数型 
参数名类 型参考可空数组备 注
份数整数型
目标值整数型
结果容器文本型
变量名类 型静态数组备 注
临时数组整数型0
清除数组 (结果容器)  ' 清空结果数组
初始化组合处理 (份数, 目标值, 临时数组, 结果容器)
返回 (取数组成员数 (结果容器))
子程序名返回值类型公开备 注
初始化组合处理  
参数名类 型参考可空数组备 注
n整数型
target整数型
当前组合整数型
结果容器文本型
回溯生成组合 (当前组合, 1, 0, n, target, 结果容器)
子程序名返回值类型公开备 注
回溯生成组合  
参数名类 型参考可空数组备 注
当前组合整数型
起始值整数型
当前和整数型
剩余份数整数型
总目标整数型
结果容器文本型
变量名类 型静态数组备 注
x整数型 
下限值整数型 
上限值整数型 
需要数值整数型 
临时组合整数型0
如果真 (剩余份数 = 0)
如果真 (当前和 = 总目标)
数组转文本 (当前组合, 结果容器)  ' 将有效组合存入结果
返回 ()

需要数值 = 总目标 - 当前和
下限值 = 取最大值A (起始值, 需要数值 - 10 � (剩余份数 - 1))
上限值 = 取最小值A (10, 需要数值 ÷ 剩余份数)
如果真 (剩余份数 = 1)
如果真 (下限值 ≤ 需要数值 需要数值 ≤ 10)
加入成员 (临时组合, 当前组合)
加入成员 (临时组合, 需要数值)
回溯生成组合 (临时组合, 需要数值, 当前和 + 需要数值, 0, 总目标, 结果容器)
返回 ()

变量循环首 (下限值, 上限值, 1, x)
加入成员 (临时组合, 当前组合)
加入成员 (临时组合, x)
回溯生成组合 (临时组合, x, 当前和 + x, 剩余份数 - 1, 总目标, 结果容器)
清除数组 (临时组合)
变量循环尾 ()
子程序名返回值类型公开备 注
数组转文本  
参数名类 型参考可空数组备 注
数组整数型
结果文本型
变量名类 型静态数组备 注
文本文本型 
i整数型 
文本 = “[”
计次循环首 (取数组成员数 (数组), i)
文本 = 文本 + 到文本 (数组 [i])
如果真 (i ≠ 取数组成员数 (数组))
文本 = 文本 + “-”

计次循环尾 ()
文本 = 文本 + “]”
加入成员 (结果, 文本)
子程序名返回值类型公开备 注
取最大值A整数型 
参数名类 型参考可空数组备 注
a整数型
b整数型
返回 (选择 (a > b, a, b))
子程序名返回值类型公开备 注
取最小值A整数型 
参数名类 型参考可空数组备 注
a整数型
b整数型
返回 (选择 (a < b, a, b))


i支持库列表   支持库注释   
spec特殊功能支持库


可以任意份数和目标值


作者: awuming    时间: 2025-2-25 07:43
可以参考 棋P 牛牛计算
作者: xiguapihenpi    时间: 2025-2-25 08:55
xiguapihenpi 发表于 2025-2-25 07:35
[e=0].版本 2
.支持库 spec

下限值 = 取最大值A (起始值, 需要数值 - 10 × (剩余份数 - 1))
作者: 萧楚楠    时间: 2025-2-25 09:10
samll88 发表于 2025-2-25 07:13
[e=0].版本 2
.支持库 spec

这样还是不太完善,起码你第一组都取到15了,而且可能会漏

function getAllPossibleSplits(total, parts, min, max) {

const results = [];


// 边界条件校验
if (parts <= 0 || total <= 0 || min > max) return [];
if (parts * min > total || parts * max < total) return [];

// 回溯算法核心
function backtrack(current, remainingTotal, remainingParts) {
    if (remainingParts === 1) {
        if (remainingTotal >= min && remainingTotal <= max) {
            results.push([...current, remainingTotal]);
        }
        return;
    }

    // 计算当前数字的取值范围
    const start = Math.max(
        min,
        remainingTotal - (remainingParts - 1) * max
    );
    const end = Math.min(
        max,
        remainingTotal - (remainingParts - 1) * min
    );

    // 遍历所有可能值
    for (let value = start; value <= end; value++) {
        current.push(value);
        backtrack(current, remainingTotal - value, remainingParts - 1);
        current.pop();
    }
}

backtrack([], total, parts);
return results;

}


// 示例用法

console.log(getAllPossibleSplits(10, 2, 3, 10));

/ 输出:

[

[3,7], [4,6], [5,5],

[6,4], [7,3]

]

/


console.log(getAllPossibleSplits(10, 3, 3, 10));

/ 输出:

[

[3,3,4], [3,4,3],

[4,3,3]

]

/


console.log(getAllPossibleSplits(20, 5, 3, 9));

/ 输出(部分示例):

[

[3,3,3,3,8], [3,3,3,4,7],

[3,3,3,5,6], ..., [9,9,1,1,0](无效项会被自动过滤)

]

/



作者: aipca    时间: 2025-2-25 09:36
见你上一贴:易语言计算问题_精易论坛

求随机数.e

7.55 KB, 下载次数: 1


作者: samll88    时间: 2025-2-25 09:55
萧楚楠 发表于 2025-2-25 09:10
这样还是不太完善,起码你第一组都取到15了,而且可能会漏

[md]function getAllPossibleSplits(total, p ...



  
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
数字5整数型 
a整数型 
b整数型 
c整数型 
d整数型 
计次整数型 
计次循环首 (10, a)
计次循环首 (10, b)
计次循环首 (10, c)
计次循环首 (10, d)
数字5 = 40 - a - b - c - d
如果真 (数字5 ≤ 10)
调试输出 (到文本 (a)“+”到文本 (b)“+”到文本 (c)“+”到文本 (d)“+”到文本 (数字5)“=”到文本 (40))
计次 = 计次 + 1
调试输出 (“总数:”, 计次)

计次循环尾 ()
计次循环尾 ()
计次循环尾 ()
计次循环尾 ()


i支持库列表   支持库注释   
spec特殊功能支持库


刚才随便写的,其实容易

作者: samll88    时间: 2025-2-25 10:00
  
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
数字5整数型 
a整数型 
b整数型 
c整数型 
d整数型 
计次整数型 
计次循环首 (10, a)
计次循环首 (10, b)
计次循环首 (10, c)
计次循环首 (10, d)
数字5 = 40 - a - b - c - d
如果真 (数字5 ≤ 10 数字5 ≠ 0)
调试输出 (到文本 (a)“+”到文本 (b)“+”到文本 (c)“+”到文本 (d)“+”到文本 (数字5)“=”到文本 (40))
计次 = 计次 + 1

计次循环尾 ()
计次循环尾 ()
计次循环尾 ()
计次循环尾 ()
调试输出 (“总数:”, 计次)
修正一下0



作者: 禁回忆    时间: 2025-2-25 10:39
  
窗口程序集名保 留  保 留备 注
程序集1   
变量名类 型数组备 注
文件号整数型  

子程序名返回值类型公开备 注
_启动子程序整数型 
变量名类 型静态数组备 注
结果数组整数型0
调试输出 (取运行目录 ())
文件号 = 打开文件 (“结果.txt”, #改写, )
如果真 (文件号 = 0)
信息框 (“无法创建文件!”, 0, , )
返回 (0)

' 查找40分5份的组合
生成组合 (1, 结果数组, 40, 0, 5, 1, 10)
' 查找30分4份的组合
生成组合 (1, 结果数组, 30, 0, 4, 1, 10)
关闭文件 (文件号)
信息框 (“结果已保存到结果.txt”, 0, , )
返回 (0)
子程序名返回值类型公开备 注
生成组合  
参数名类 型参考可空数组备 注
当前位置整数型
当前数组整数型
剩余总和整数型
前一个数整数型
总份数整数型
最小值整数型
最大值整数型
变量名类 型静态数组备 注
i整数型 
起始值整数型 
remaining整数型 
剩下位置数整数型 
min_required整数型 
max_allowed整数型 
如果 (当前位置 = 总份数)
如果 (剩余总和 ≥ 前一个数 剩余总和 ≤ 最大值 剩余总和 ≥ 最小值)
加入成员 (当前数组, 剩余总和)
写出文本 (文件号, 数组到字符串 (当前数组, “-”)#换行符 )
删除成员 (当前数组, 取数组成员数 (当前数组), 1)



起始值 = 前一个数
如果 (起始值 < 最小值)
起始值 = 最小值



变量循环首 (起始值, 最大值, 1, i)
remaining = 剩余总和 - i
剩下位置数 = 总份数 - 当前位置
min_required = 剩下位置数 × 最小值
max_allowed = 剩下位置数 × 最大值
如果真 (remaining ≥ min_required remaining ≤ max_allowed)
加入成员 (当前数组, i)
生成组合 (当前位置 + 1, 当前数组, remaining, i, 总份数, 最小值, 最大值)
删除成员 (当前数组, 取数组成员数 (当前数组), 1)

变量循环尾 ()
返回 ()
子程序名返回值类型公开备 注
数组到字符串文本型 
参数名类 型参考可空数组备 注
数组整数型
分隔符文本型
变量名类 型静态数组备 注
结果文本型 
i整数型 
计次循环首 (取数组成员数 (数组), i)
结果 = 结果 + 到文本 (数组 [i]) + 分隔符
计次循环尾 ()
如果真 (取文本长度 (结果) > 0)
结果 = 取文本左边 (结果, 取文本长度 (结果)取文本长度 (分隔符))

返回 (结果)


i支持库列表   支持库注释   
spec特殊功能支持库



运行结果
1-9-10-10-10
2-8-10-10-10
2-9-9-10-10
3-7-10-10-10
3-8-9-10-10
3-9-9-9-10
4-6-10-10-10
4-7-9-10-10
4-8-8-10-10
4-8-9-9-10
4-9-9-9-9
5-5-10-10-10
5-6-9-10-10
5-7-8-10-10
5-7-9-9-10
5-8-8-9-10
5-8-9-9-9
6-6-8-10-10
6-6-9-9-10
6-7-7-10-10
6-7-8-9-10
6-7-9-9-9
6-8-8-8-10
6-8-8-9-9
7-7-7-9-10
7-7-8-8-10
7-7-8-9-9
7-8-8-8-9
8-8-8-8-8
1-9-10-10
2-8-10-10
2-9-9-10
3-7-10-10
3-8-9-10
3-9-9-9
4-6-10-10
4-7-9-10
4-8-8-10
4-8-9-9
5-5-10-10
5-6-9-10
5-7-8-10
5-7-9-9
5-8-8-9
6-6-8-10
6-6-9-9
6-7-7-10
6-7-8-9
6-8-8-8
7-7-7-9
7-7-8-8
源码文件:
111.e (4.95 KB, 下载次数: 0)

作者: 1752328925    时间: 2025-2-25 14:36
我已经把所有的可能都循环出来了
其余的你来做

demo.e

62.74 KB, 下载次数: 0


作者: ye347549299    时间: 2025-2-25 17:42
谢谢各位大神解答  我自己写出来了 因为太多人回答了 我都不知道选哪个最佳 我就选第一个回答那个吧 其他人非常抱歉




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4