均匀划分c#

时间:2009-02-23 12:03:44

标签: c#

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

所以结果将是

  1. 16
  2. 14
  3. 14
  4. 14
  5. 14
  6. 14
  7. 14
  8. 以下代码不正确,因为所有7个值都设置为15(总计105)。

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

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

    由于

6 个答案:

答案 0 :(得分:21)

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

// This doesn't try to cope with negative numbers :)
public static IEnumerable<int> 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);
}

答案 1 :(得分:6)

你走了:

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

祝你好运在课堂上解释:)

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

算法就是这个

  1. 将100除以7,将结果放入X
  2. 获得X以下的最高偶数并将其放入Y.
  3. 将Y乘以7并将答案放在Z中。
  4. 将Z从100开始。
  5. 答案是6批Y加上第4步的结果。

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

    我相信你可以用C#

    写出来

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

不确定为什么要使用双打但需要整数除法语义。

    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;
    }

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