You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#实现按各产品最大值生成全部组合的技术需求与问题

解决方案

我们需要实现一个支持每个位置自定义最大值的组合生成函数,核心思路是将组合编号按「可变进制」分解为对应位置的数字,具体实现如下:

实现逻辑

  1. 把输入的字符串最大值列表转为整数数组,明确每个位置的取值范围(从0到对应最大值)。
  2. 计算总组合数:每个位置的可能取值数量(最大值 + 1)的乘积。
  3. 预计算每个位置的「权重」(后续所有位置的取值数量乘积),用于快速分解组合编号。
  4. 遍历每个组合编号,通过权重分解出每个位置的数字,拼接成目标字符串。

代码实现

private List<string> GetCustomCombinationSet(List<string> maxEachProduit)
{
    // 将字符串最大值转为整数数组
    int[] maxValues = maxEachProduit.Select(s => int.Parse(s)).ToArray();
    List<string> combinations = new List<string>();

    // 计算总组合数
    int totalCombinations = 1;
    foreach (int max in maxValues)
    {
        totalCombinations *= (max + 1);
    }

    // 预计算每个位置的权重(后续位置取值数的乘积)
    int[] weights = new int[maxValues.Length];
    weights[^1] = 1; // 最后一位权重固定为1
    for (int i = weights.Length - 2; i >= 0; i--)
    {
        weights[i] = weights[i + 1] * (maxValues[i + 1] + 1);
    }

    // 生成所有组合
    for (int i = 0; i < totalCombinations; i++)
    {
        int remaining = i;
        StringBuilder sb = new StringBuilder();
        foreach (int weight in weights)
        {
            int digit = remaining / weight;
            sb.Append(digit);
            remaining %= weight;
        }
        combinations.Add(sb.ToString());
    }

    return combinations;
}

使用示例

示例1:输入{"2", "3"}

调用函数后将生成:
"00", "01", "02", "03", "10", "11", "12", "13", "20", "21", "22", "23"

示例2:输入{"2", "1", "1"}

调用函数后将生成从"000"到"211"的全部12种组合。

注意事项

  • 确保输入的字符串都能转换为非负整数,否则int.Parse会抛出异常,可按需添加异常捕获逻辑。
  • 若总组合数超出int范围(比如多组大最大值的情况),可改用long类型计算总数量和遍历编号。

内容的提问来源于stack exchange,提问作者SkiBoxing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 20:33:28