均匀划分c#

在c#中如何将100均分为7?

结果就是

  1. 16
  2. 14
  3. 14
  4. 14
  5. 14
  6. 14
  7. 14

以下代码不正确,因为所有7个值都设置为15(总计105)。

double [] vals = new double[7]; for (int i = 0; i < vals.Length; i++) { vals[i] = Math.Ceiling(100d / vals.Length); } 

在c#中有一个简单的方法吗?

谢谢

为了得到我建议的15,15,14,14,14,14,14的结果:

 // This doesn't try to cope with negative numbers :) public static IEnumerable DivideEvenly(int numerator, int denominator) { int rem; int div = Math.DivRem(numerator, denominator, out rem); for (int i=0; i < denominator; i++) { yield return i < rem ? div+1 : div; } } Test: foreach (int i in DivideEvenly(100, 7)) { Console.WriteLine(i); } 

干得好:

 Func> f = (a, b) => Enumerable.Range(0,a/b).Select((n) => a / b + ((a % b) <= n ? 0 : 1)) 

祝你在课堂上解释它:)

由于这似乎是家庭作业,这里有一个提示,而不是完整的代码。

您正在进行Math.Ceiling并将14.28转换为15。

算法是这样的

  1. 将100除以7,将结果放入X.
  2. 获得X以下的最高偶数并将其放入Y.
  3. 将Y乘以7并将答案放在Z中。
  4. 从Z远离100。

答案是6批Y加上第4步的结果。

此算法可能仅适用于此特定实例。

我相信你可以用C#写出来

不确定这是否正是你所追求的,但我认为如果你使用Math.ceiling,你总会得到太大的总和。 Math.floor会低估并为您留下一些差异,可以根据您的需要添加到您的某件作品中。

例如,通过这种方法你最终可能会得到7个14的剩余部分给你2个剩余部分。然后你可以将这个2放入你的一个部分中,给出你建议的答案,或者你可以将它平均分开并添加得到两件15件(如其中一条评论所述)

不确定为什么你正在使用双打但想要整数除法语义。

  double input = 100; const int Buckets = 7; double[] vals = new double[Buckets]; for (int i = 0; i < vals.Length; i++) { vals[i] = Math.Floor(input / Buckets); } double remainder = input % Buckets; // give all of the remainder to the first value vals[0] += remainder; 

具有更大灵活性的整数的例子,

  int input = 100; const int Buckets = 7; int [] vals = new int[Buckets]; for (int i = 0; i < vals.Length; i++) { vals[i] = input / Buckets; } int remainder = input % Buckets; // give all of the remainder to the first value vals[0] += remainder; // If instead you wanted to distribute the remainder evenly, // priority to first for (int r = 0; r < remainder;r++) { vals[r % Buckets] += 1; } 

值得指出的是,双重示例可能在数值上不稳定 ,因为某些输入值和桶大小可能导致泄漏的小数值。