Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中选择k元素子集处理大数的算法#_C#_Algorithm_Subset_Combinatorics_Discrete Mathematics - Fatal编程技术网

C# 在C语言中选择k元素子集处理大数的算法#

C# 在C语言中选择k元素子集处理大数的算法#,c#,algorithm,subset,combinatorics,discrete-mathematics,C#,Algorithm,Subset,Combinatorics,Discrete Mathematics,我正在写一个算法,它从一组(n个元素)中选择一个子集(k个元素) 我成功地完成了任务。它适用于小数字。 我已经测试了n=6,k=3和n=10,k=5 问题从现在开始,我需要用它来处理大量的数据。 有时我需要使用它,比如n=96000000和k=3000。 为了简单地测试一个位,让我们关注n=786432和k=1000的示例。然后就有461946653375201这样的可能性。作为我的函数的第三个参数,有秩数,因此该数为特定的唯一子集。让我们尝试几个随机数,例如3264832工作正常(给了我不同数

我正在写一个算法,它从一组(n个元素)中选择一个子集(k个元素)

我成功地完成了任务。它适用于小数字。 我已经测试了n=6,k=3和n=10,k=5

问题从现在开始,我需要用它来处理大量的数据。 有时我需要使用它,比如n=96000000和k=3000。 为了简单地测试一个位,让我们关注n=786432和k=1000的示例。然后就有461946653375201这样的可能性。作为我的函数的第三个参数,有秩数,因此该数为特定的唯一子集。让我们尝试几个随机数,例如3264832工作正常(给了我不同数字的子集),但对于4619466533201,一个数字(在子集中)重复了几次,有什么不对。它也必须根据唯一的数字进行设置

问题是如何使其正确工作,问题是什么?这些数字对乌龙来说都太大了

如果你有任何问题,请随时提问

这是我的密码:

    public static ulong BinomialCoefficient(ulong N, ulong K)
    {
        ulong result = 1;
        for (ulong i = 1; i <= K; i++)
        {
            result *= N - (K - i);
            result /= i;
        }
        return result;
    }

    public static ulong[] ChooseSubsetByRank(ulong sizeOfSet, ulong sizeOfSubset, ulong rank)
    {
        ulong[] resultingSubset = new ulong[sizeOfSubset];
        ulong x = sizeOfSet;

        for (ulong i = sizeOfSubset; i > 0; i--)
        {
            while (BinomialCoefficient(x, i) > rank)
                x--;

            resultingSubset[i - 1] = x + 1;
            rank = BinomialCoefficient(x + 1, i) - rank - 1;
        }

        return resultingSubset;
    }
public static ulong binomialcofficient(ulong N,ulong K)
{
ulong结果=1;
对于(ulong i=1;i 0;i--)
{
while(有效(x,i)>秩)
x--;
结果子集[i-1]=x+1;
秩=二元有效(x+1,i)-秩-1;
}
返回结果子集;
}
下面是运行代码。要测试它,您可以更改下面一行的第三个参数

        ulong[] arrayTest = Logic.ChooseSubsetByRank(786432, 1000, 4619466533201);
        string test = "";
        for (int i = 0; i < arrayTest.Length; i++)
            test = test + arrayTest[i].ToString() + " ";
        System.Windows.MessageBox.Show(" " + test);
ulong[]arrayTest=Logic.ChooseSubsetByRank(78643210004619466533201);
字符串测试=”;
for(int i=0;i
没有希望。您可以

正如spender所说:使用BigInteger

您的计算是错误的(如果您使用非常有限的ulong进行计算,则可能是错误的)

C7864321000实际上是:

60335739263255945515318386873570215053730882377088922713614118020657478889107558571269757699986693008321799376048348564485573032321450771278111851575667219335061769573572992263413625590591114269104378722587459276616360822329850929182830806824098216567186175635880811026388564949474712220379628181819851586102239666570609503625289342024033411048711941363429455506516639821976768857855679191869781534116510021366271594304373741203853535881894296043563472156489842575247987449444598995326776847699528937594262021908950340183279781975880912432965772469157325407981025799085606836359254956011191432682080222334398084335717472764329978943896134140386694200515981958781293726511997433435103150515077554731125783503916125855484960986566157481677151116116803376878241936924185832333634153098204209399941040241706483871868606431296583686224959877014291865970810648293526657406798541232168029275081701910447965073614150233260672430240041246137331188158402096329727943783581966635549080497011598343664562846068867941682668062137813283485745281623298214823853283760039837871051475827652941060032427179709050281844482542775351325598482851547246270671490069719426110588176812416933807260794267521989963024682229895011732354439902345360352851782939077191510303617396175595515942280648307637076206853890280355224479498636272879457330602568386603847079370351393565398774470227713702084286211654430048168851962570811584329927571874759696189949191048089714895540696298526934134163046091028751698453463241294075162951301814494797895293294425158546275400439295327226881921775157357592531933219043574406276399008988573215768434245087318030773554908398464758221069812188451378576257882707907749932122462823135308345105518448318277779903163285781080826928611267945738458843198645986339444057840076509455705962862720788751019842751798020666179405581219826339160355202288311804741597225421159214370612781598548669260087060797662356199843437309124429535678470899723562542277741520930405646492434115187826250358725619838414271804985504262151914903852317756982823164169039317386590288325447735634073093990554315454074675984209374418472370601938487368346797466773120641197786354810448874133279719288778900575977771615390142369251114230933333304414440429584259637999336326361951407727784740167350888869130319056495693724090460571833340347787573512591305360525021867100967412977356432595931193055600673518590755769122079371874551391109604335857942828885231240186270734717407915723357297223158422168351192854813077120772997147626243694716780586248972224779194439324980417722708188935257224764710176772827714920684441771238017080976044247130698350597778451742562179412286183903132956207422425247625669295018747365569868831493234430432506807649141973141385164105895714924582776136353646355063603077900970311721684350003193075513673577102216248178453150037839339058155869537009962748882565124888447384419571925862145122998752031754294356629734069802846681893733597679234338278813451874062399366413180257669048550542054286584256967533331490072697682595144844546765074896373122159341264979663939568501846304043177902065615957160804418464617725183994038626742265787780196708267225107906237183824765375909480520506199566649638083679757430680818796170362008227564859519761936618260089868694546582873807145215865272320