德尔福除法与其余部分均分(MOD)

标签 delphi math division

我有一个数学问题,我尝试用 Delphi 函数来解决。我试图将一个整数分成(几乎)相等的部分。示例:

您有 10 个测试用例,您希望分 3 部分执行它们。因此,平衡工作负载的最佳方法是执行 3、3 和 4,而不是 1、1 和 8。

procedure calc_stream_numbers;
var div_res,rest:double;
    total,streams:integer;
begin
total := 10; 
streams := 3;
 div_res := total DIV streams;
 rest := total MOD streams;
 showmessage('Items: '  +IntToStr(total)+#13#10+
              'Streams: '+IntToStr(streams)+#13#10+
              'Result: '+FloatToStr(div_res)+
              'Rest: '+FloatToStr(rest));
end;

这给了我除法结果 10/3 = 3 (Rest 1) 所以我可以执行 3 x 3 个测试用例,总共 9 个。要执行全部 10 个流,我必须将剩余的一个添加到 3 个流中的任意一个。但是如果你有一个更复杂的例子..

我确信有一个数学表达式,但我必须承认,我没有任何线索。也许你能启发我这样的划分是如何调用的以及是否有任何内置的delphi函数。

最佳答案

这是:http://en.wikipedia.org/wiki/Bresenham's_line_algorithm

一个维度是工作负载量,另一个维度是工作人员数量

<小时/>

嗯,2D 图形的目标是养眼,因此在“短”片段中公平地分配“长”片段。 对于您的情况,我们可以将所有“长”的都偏向一端。

function SplitIntoEqualParts(Total, Count: Integer): TArray<Integer>;
var
  i: Integer;
  delta, delta1, extra: Word;
begin
  Assert( Count < High(Word) ); // RTL DivMod limitation
  SetLength(Result, Count);

  DivMod(Total, Count, delta, extra); 
  // one division operation is 2 times faster than two separate operations :-D
  delta1 := Succ(delta);      

  for i := 0 to extra-1 do 
    Result[i] := delta1;    
  for i := extra to Count-1 do 
    Result[i] := delta;    
end;

关于德尔福除法与其余部分均分(MOD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30782474/

相关文章:

delphi - 将 Windows 桌面应用程序连接到远程位置

math - 网格中的矩形 - 我需要有关边缘情况的帮助

python - 在 python 中覆盖 truediv

actionscript-3 - 如何在没有精度错误的情况下正确划分微小的 double 字?

android - 带有 TWebBrowser 的多 View Android Delphi

multithreading - 多线程 WinHttp 下载

Delphi 2009 - 检测组件是否安装

java - 将 big double 转换为 long 时精度损失

algorithm - 寻找具有特定性质的整数 - 欧拉计划问题 221

algorithm - ARM整数除法算法