在c#中如何将100均分为7?
所以结果将是
以下代码不正确,因为所有7个值都设置为15(总计105)。
double [] vals = new double[7];
for (int i = 0; i < vals.Length; i++)
{
vals[i] = Math.Ceiling(100d / vals.Length);
}
在c#中有一种简单的方法吗?
由于
答案 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)
算法就是这个
答案是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;
}
值得指出的是,双重示例可能不是数值稳定的,因为某些输入值和存储桶大小可能会导致泄漏的小数值。