将数字间隔分成X个较小的间隔

时间:2017-03-10 20:53:35

标签: c# algorithm math numbers intervals

我正在研究在给定时间间隔内计算素数的客户端 - 服务器应用程序。客户端已完成,但我遇到了服务器。我正在寻找将给定间隔分成X(连接的客户端数量)较小的算法。 (例如2-50与5个客户将分成2-10 11-20 21-30 31-40 41-50) 有人可以帮我找到可用的算法吗?谢谢。

找到此代码,但不适用于大数

    private static string[] divide(ulong min, ulong max, ulong parts)
    {
        if (min > max) return null;
        List<string> list = new List<string>(); 
        ulong chunksize = max / parts;
        ulong chunkstart = min;
        ulong chunkend = chunkstart + chunksize - 1;
        while(chunkstart < max)
        {
            if(chunkend > max)
            {
                list.Add(string.Format("{0}:{1}", chunkstart, max));
                break;
            }
            list.Add(string.Format("{0}:{1}", chunkstart, chunkend));
            chunkstart += chunksize;
            chunkend += chunksize;
        }
        return list.ToArray();
    }

1 个答案:

答案 0 :(得分:0)

给它一个机会。检查参数“parts”的值是否用于划分间隔的长度,而不是像您所做的那样划分最大值。此代码还会考虑余数,并将其按1开始分配到开头的间隔。这就是你的输入(min:2,max:50,parts:5)的原因,它给出了输出

2:12
12:22
22:32
32:41
41:50

using System.IO;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var x = Divide(2, 50, 5);
        foreach(var y in x) Console.WriteLine("{0}:{1}", y.Item1, y.Item2);
    }
    private static List<Tuple<ulong, ulong>> Divide(ulong min, ulong max, ulong parts) 
    {
        ulong stepSize = (max - min) / parts;
        if (stepSize <= 0) return null;

        ulong mod = (max - min) % parts;
        var result = new List<Tuple<ulong, ulong>>();
        ulong begin = min;
        ulong end;
        for (ulong i = 0; i < parts; i++) 
        {
            end = begin + stepSize;
            if (mod > 0)
            {
                mod--;
                end += 1;
            }
            var t = new Tuple<ulong, ulong>(begin, end);
            result.Add(t);
            begin = end;
        }
        return result;
    }

}