算法!用C#写一个函数,在一个数组中找出随意几个值相加等于一个值
比如,数组{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}  
要找出那些数相加等于100

 解决方案一:
      #region  解决方案一
int[] myarray = { , , , , , , , , , , , , , , , , , , , };
List<List<int>> mylist = new List<List<int>>();
int length = myarray.Length;
for (int i = ; i < Math.Pow(, length); i++)
{
List<int> myint = new List<int>();
for (int j = ; j < length; j++)
{
if (Convert.ToBoolean(i & ( << j)))
myint.Add(myarray[j]);
}
mylist.Add(myint);
}
foreach (var a in mylist)
{
if (a.Sum() == )
{
foreach (var b in a)
{
Console.Write(b); Console.Write(",");
}
Console.WriteLine();
}
}
Console.ReadKey();
Console.WriteLine("--------------");
#endregion
 解决方案二:使用迭代器
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。
迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,
它可以把抽象容器和通用算法有机的统一起来。
 static void Main(string[] args)
{
double[] myarray1 = { 1.1, 13.6, 14.8, 15.9, 16.4, 17.7, 2.5, 3.3, 4.9, 5.8, 6.8, 7.5, 8.7, 9.4, 10.7, 11.2, 12.9, 13.6, 14.8, 15.9, 16.4, 17.7, 18.4, 19.2 };
int cnt = ;
foreach (var result in SelectCompute(myarray1, 100.0, myarray1.Length - ))
{
Console.Write("结果{0}==> ", ++cnt);
foreach (var n in result)
Console.Write("{0} ", n);
Console.WriteLine();
}
Console.WriteLine("--------------End");
Console.ReadKey();
#endregion
} /// <summary>
/// 寻找组合 迭代器算法
/// </summary>
/// <param name="array">数组</param>
/// <param name="sum">总数</param>
/// <param name="index"></param>
/// <returns></returns>
static IEnumerable<IEnumerable<double>> SelectCompute(double[] array, double sum, int index)
{
if (index >= )
{
foreach (var sub in SelectCompute(array, sum, index - ))
yield return sub; foreach (var sub in SelectCompute(array, sum - array[index], index - ))
yield return sub.Concat(new double[] { array[index] }); if (Math.Abs(array[index] - sum) <= double.Epsilon)
yield return new double[] { array[index] };
}
}

用C#写一个函数,在一个数组中找出随意几个值相加等于一个值 与迭代器对比的更多相关文章

  1. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

  2. Leetcode33--->Search in Rotated Sorted Array(在旋转数组中找出给定的target值的位置)

    题目: 给定一个旋转数组,但是你不知道旋转位置,在旋转数组中找出给定target值出现的位置:你可以假设在数组中没有重复值出现 举例: (i.e., 0 1 2 4 5 6 7 might becom ...

  3. C语言:对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

    //对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. #include <stdio.h& ...

  4. [原]Java面试题-输入一个整型数组,找出最大值、最小值,并交换。

    [Date]2013-09-19 [Author]wintys (wintys@gmail.com) http://wintys.cnblogs.com [Content]: 1.面试题 输入一个整型 ...

  5. C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置

    #include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7, ...

  6. 从数组中找出所有组合为s的数

    java版本 package numCombine; /** * 从数组中找出所有组合为s的数 * @author root * */ public class NumComberAll { publ ...

  7. 3sum(从数组中找出三个数的和为0)

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  8. 数组中找出最小的K个数

    题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 public static void printKNum ...

  9. Leetcode34--->Search for a Range(在排序数组中找出给定值出现的范围)

    题目:给定一个排序数组,找出给定的target值出现的范围:算法复杂度要求在O(logn);如果没有找到,则返回[-1, -1]; 举例: For example,Given [5, 7, 7, 8, ...

随机推荐

  1. leetcode230

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  2. C语言学习笔记--#和##操作符

    1. #运算符 (1)#运算符用于在预处理期将宏的参数转换为字符串 (2)#的转换作用是在预处理期完成的,因此只在宏定义中有效,即其他地方不能用#运算符 (3)用法:#define STRING(x) ...

  3. linux动态内核模块编程-3

    将一组与模块相关的命令加载进内核 完成功能类似2,打印proc下的相关信息.但是不用重新编译内核,节省时间,更为灵活 内核模块介绍 模块是在内核空间运行的程序,实际上是一种目标文件,不能单独运行但其代 ...

  4. OSI七层网络模型与TCP/IP四层网络模型

    1.OSI网络7层模型 网络协议设计者不应当设计一个单一.巨大的协议来为所有形式的通信规定完整的细节,而应把通信问题划分成多个小问题,然后为每一个小问题设计一个单独的协议.这样做使得每个协议的设计.分 ...

  5. 学习CSS的思路(转)

    两周之前写过该系列的第一篇,其实当时只是一个想法,这段时间迟迟未更新,是在思考一个解决过程.现在初有成效,就开更吧. 1. 一个段子 开题不必太严肃,写博客也不像写书,像聊天似的写东西是最好的表达方式 ...

  6. centos 端口iptables配置

    1.安装iptables yum install iptables* -y 2.打开端口 iptables -I INPUT -p tcp --dport -j ACCEPT 3.查看本机关于IPTA ...

  7. linux 监控内存介绍

    一:系统监控:1.对cpu的监测:查看进程占用内存情况 top pid user PRI NI size RSS share stat 进程号 进程所属用户 优先级 优先级 进程所占空间 使用物理内存 ...

  8. SQL获取时间戳流水号

    流水号生成规则: 1:流水号总长度为22位数 2:流水号总共分三部分:标头(2位)+ 时间戳(YYYYMMDDHHmmSSsss共17位)+ 随机码(3位) 举例流水号:SN2015081210240 ...

  9. Tensorflow递归神经网络学习练习

    import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #载入数据集mnist = inpu ...

  10. C++使用标准库的栈和队列

    转自http://blog.csdn.net/zhy_cheng/article/details/8090346 使用标准库的栈和队列时,先包含相关的头文件 #include<stack> ...