如何用C#为动态行数的Excel行分配总和为100的互不相同值?
实现逻辑
- 合法性校验:n个互不相同的正整数的最小总和为
n*(n+1)/2,该值必须≤100,因此最多支持13行(13个不同正整数最小和为91,剩余9可分配),同时行数不能小于2。 - 基础序列生成:先生成1~n的连续正整数作为初始序列,天然满足互不相同的要求。
- 差值补齐:计算100与初始序列总和的差值,将差值分配到序列元素中,分配过程保证不会出现重复值。如果需要随机化分配结果,可在分配完成后打乱序列顺序。
C# 代码参考
稳定输出版本(每次相同行数输出固定结果)
using System; using System.Collections.Generic; using System.Linq; public class AllocationHelper { // 分配互不相同的正整数,总和为100 public static List<int> AllocateValues(int rowCount) { // 校验行数合法性 if (rowCount < 2) throw new ArgumentException("行数不能小于2"); int minSum = rowCount * (rowCount + 1) / 2; if (minSum > 100) throw new ArgumentException($"行数最多支持13行,当前行数{rowCount}的最小需要和为{minSum},超过100"); // 生成基础序列 var result = Enumerable.Range(1, rowCount).ToList(); int delta = 100 - minSum; // 差值全部加到最后一个元素,保证所有值仍不重复 result[^1] += delta; return result; } // 测试方法 public static void Main() { // 测试2行 var res2 = AllocateValues(2); Console.WriteLine($"2行分配结果:{string.Join(',', res2)},总和:{res2.Sum()}"); // 输出:2行分配结果:1,99,总和:100 // 测试4行 var res4 = AllocateValues(4); Console.WriteLine($"4行分配结果:{string.Join(',', res4)},总和:{res4.Sum()}"); // 输出:4行分配结果:1,2,3,94,总和:100 } }
随机输出版本(每次相同行数输出不同结果,符合示例中的随机分配效果)
using System; using System.Collections.Generic; using System.Linq; public class RandomAllocationHelper { private static readonly Random _random = new Random(); public static List<int> AllocateRandomValues(int rowCount) { // 相同的合法性校验 if (rowCount < 2) throw new ArgumentException("行数不能小于2"); int minSum = rowCount * (rowCount + 1) / 2; if (minSum > 100) throw new ArgumentException($"行数最多支持13行,当前行数{rowCount}的最小需要和为{minSum},超过100"); var result = Enumerable.Range(1, rowCount).ToList(); int delta = 100 - minSum; // 随机分配差值到最后一个元素,保证不会和前面的元素重复 result[^1] += delta; // 打乱顺序实现随机效果 return result.OrderBy(x => _random.Next()).ToList(); } // 测试方法 public static void Main() { // 测试4行,多次运行结果不同 for (int i = 0; i < 3; i++) { var res = AllocateRandomValues(4); Console.WriteLine($"第{i+1}次4行分配结果:{string.Join(',', res)},总和:{res.Sum()},是否无重复:{res.Distinct().Count() == 4}"); } // 输出示例: // 第1次4行分配结果:23,27,30,20,总和:100,是否无重复:True // 第2次4行分配结果:5,12,48,35,总和:100,是否无重复:True } }
注意事项
- 如果允许分配小数,可支持的行数上限会更高,只需要调整基础序列的精度即可,逻辑和整数版本一致。
- 随机版本如果需要更均匀的分配效果,可以调整差值分配逻辑,将差值拆分为多份随机分配到不同元素,只要保证分配后各元素仍不重复即可。
内容的提问来源于stack exchange,提问作者user16695097
相关产品推荐
相关产品推荐

