当前位置: 首页 > 编程语言 > C#

C#LearningTutorial-AlgorithmtoFindtheCorrectSetofNumbersShare

时间:2023-04-10 11:36:15 C#

AlgorithmtoFindtheCorrectSetofNumbers我将使用python解决c#3,850.9720.8320.8386.8137.7136.336,619.42264.53......我知道在这组数字,有一个数字组合可以加起来达到一定数量比方说它是2341.42我怎样才能找出哪个数字组合可以加起来?我正在帮助会计师跟踪正确的数字[开始编辑]:我误读了原始问题。我认为它表示在200多个数字的列表中有4个数字的组合,这些数字加起来是其他数字。那不是被问到的,所以我的回答没有多大帮助。[编辑结束]这很笨拙,但如果你只需要找到4个加起来等于某个值的数字(它可以找到超过4个元组),它应该可以工作:只需将200个数字放入数组(或列表或一些IEnumerable结构),那么你可以使用我发布的代码。如果纸上有数字,则必须手动将它们输入到数组中,如下所示。如果您在软拷贝中使用它们,您可以剪切并粘贴它们,然后在它们周围添加数字[x]=xxx代码。或者,您可以将它们剪切并粘贴到一个文件中,然后将该文件从磁盘读取到一个数组中。双[]数字=新数字[200];数字[0]=123;数字[1]=456;////等等。//变量n0=数字;varn1=numbers.Skip(1);varn2=numbers.Skip(2);varn3=numbers.Skip(3);varx=fromainn0frombinn1fromcinn2fromdinn3wherea+b+c+d==2341.42selectnew{a1=a,b1=b,c1=c,d1=d};foreach(varaainx){Console.WriteLine("{0},{1},{2},{3}",aa.a1,aa.b1,aa.c1,aa.d1);您可以使用回溯来生成所有可能的解决方案。这样您就可以快速编写解决方案。编辑:您只需在C#中实现该算法:elseif(sum+potentialSolution==targetValue){if(depth==0){solution=potentialSolution+"";/*存储解决方案*/}else{solution+=","+potentialSolution;/*存储解决方案*/}}else{if(depth==0){solution=potentialSolution+"";}else{solution+=","+potentialSolution;}backtrack(sum+potentialSolution,solution,numbers,depth+1,targetValue,i+1);您可以这样调用此函数:backtrack(0,"",numbers,0,2341.42,0);源码是动态实现的,回答你的问题,没有测试,但本质上面说了,你能明白我的意思。这是Python中的一个递归函数,它将找到任何大小的所有解决方案,只有两个参数(您需要指定)。deffind_all_sum_subsets(target_sum,numbers,offset=0):solutions=[]foriinxrange(offset,len(numbers)):value=numbers[i]iftarget_sum==value:solutions.append([value])eliftarget_sum>value:sub_solutions=find_all_sum_subsets(target_sum-value,numbers,i+1)forsub_solutioninsub_solutions:solutions.append(sub_solution+[value])returnsolutions这是工作:>>>find_all_sum_subsets(10,[1,2),3,4,5,6,7,8,9,10,11,12])[[4,3,2,1],[7,2,1],[6,3,1],[5,4,1],[9,1],[5,3,2],[8,2],[7,3],[6,4],[10]]>>>如果找到任意两(2)一个数字的组合,请尝试以下方法:floattargetSum=3;float[]numbers=newfloat[]{1,2,3,4,5,6};排序(数字);//按升序排列数字。int开始索引=0;intendIndex=numbers.Length-1;while(startIndex!=endIndex){floatfirstNumber=numbers[startIndex];floatsecondNumber=numbers[endIndex];floatsum=firstNumber+secondNumber;if(sum==targetSum){//找到一个组合。休息;}别的if(sum请记住,在使用浮点数或小数时,舍入可能是一个问题,这应该作为递归算法来实现。基本上,对于任何给定的数字,确定是否存在剩余数字的子集,其总和是您的期望值。遍历数字列表;对于每个条目,从总数中减去值并确定是否有剩余列表的子集加起来等于新总数。如果没有,请尝试原始总数和列表中的下一个数字(当然还有一个更小的子列表)。至于实现:你想定义一个方法,它接受一个目标数字和一个列表,并返回一个数字列表,总和为该目标数字。算法应该遍历列表;如果从目标数字中减去的列表元素为零,则返回列表中的该元素;否则,使用列表的其余部分和新的目标数字递归该方法。如果任何递归返回非空结果,则返回;否则,returnnull.ArrayListFindSumSubset(decimalsum,ArrayListlist){for(inti=0;i().Add(值);}else{varsubset=FindSumSubset(sum-value,list.GetRange(i+1,list.Length-i);if(subset!=null){returnsubset.Add(value);}}}returnnull;}但是注意这个顺序是非常难看的,对于数字大得多的数组,这个顺序相对比较棘手。不过,这应该在小于200位小数的地质时间内完成。以上是《C#学习教程:算法》的全部内容寻找正确的数字集分享,如果对大家有用还需要了解更多关于C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如有涉及侵权,请点击维权联系管理员删除,如需转载请注明出处: