精易论坛
标题: 易语言遍历数 [打印本页]
作者: 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
计次循环首 (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
)
计次循环尾 ()
补充内容 (2025-2-25 07:21):
写错了,看下面
作者: samll88 时间: 2025-2-25 07:20
计次循环首 (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
)

计次循环尾 ()刚才也错了,改下
作者: xiguapihenpi 时间: 2025-2-25 07:35
窗口程序集名 | 保 留 | 保 留 | 备 注 |
窗口程序集_启动窗口 | | | |
寻找组合 (5, 40, 组合数组
) 输出调试文本 (“40分5份:”)调试输出 (组合数组
)清除数组 (组合数组
)寻找组合 (4, 30, 组合数组
) 输出调试文本 (“30分4份:”)调试输出 (组合数组
)|
寻找组合 | 整数型 | |
|
份数 | 整数型 | | | |
目标值 | 整数型 | | | | 结果容器 | 文本型 | | | |
清除数组 (结果容器
) 初始化组合处理 (份数, 目标值, 临时数组, 结果容器
)返回 (取数组成员数 (结果容器
))
|
初始化组合处理 | | |
|
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 ≠
取数组成员数 (数组
))


文本 = 文本 +
“-”

计次循环尾 ()文本 = 文本 +
“]”加入成员 (结果, 文本
)返回 (选择 (a > b, a, b
))
返回 (选择 (a < b, a, b
))
可以任意份数和目标值
作者: awuming 时间: 2025-2-25 07:43
可以参考 棋P 牛牛计算
作者: xiguapihenpi 时间: 2025-2-25 08:55
下限值 = 取最大值A (起始值, 需要数值 - 10 × (剩余份数 - 1))
作者: 萧楚楠 时间: 2025-2-25 09:10
这样还是不太完善,起码你第一组都取到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
刚才随便写的,其实容易
作者: samll88 时间: 2025-2-25 10:00
作者: 禁回忆 时间: 2025-2-25 10:39
窗口程序集名 | 保 留 | 保 留 | 备 注 |
程序集1 | | | |
变量名 | 类 型 | 数组 | 备 注 |
文件号 | 整数型 | |
调试输出 (取运行目录 ())
文件号 =
打开文件 (“结果.txt”,
#改写, )
如果真 (文件号 = 0
)
信息框 (“无法创建文件!”, 0, ,
)
返回 (0
)
生成组合 (1, 结果数组, 40, 0, 5, 1, 10
) 生成组合 (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
]) + 分隔符
计次循环尾 ()
如果真 (取文本长度 (结果
) > 0
)
结果 =
取文本左边 (结果,
取文本长度 (结果
) -
取文本长度 (分隔符
))
返回 (结果
)
运行结果
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 |