C++寻找数组元素组合之和为给定数

来源:互联网 发布:oracle 数据字典 编辑:程序博客网 时间:2024/05/02 02:01

问题描述:a=[2,3],b=6,将数组a中各个元素组合起来,让其和等于b。求这样的组合。
这道题很简单,组合有两种2+2+23+3

上面,是室友大半夜微信问我的一道程序题(大周五,博主正在家休息Happy —_—)。这问题很明显要用迭代。
他写的程序,只能输出2+2+2,这对组合,让我帮他改正一下。
室友程序如下:

public class DiguiNum {    public static void main(String[] args) {        int[] a = { 2, 3 };        int b = 6;        int num = 0;        String s = null;        diguiArrayNum(a, b, num, s);    }    public static void diguiArrayNum(int[] a, int b, int num, String s) {        for (int i=0; i < a.length; i++)         {            //相加直接大于6,跳出本次循环            if ((num + a[i]) > b)             {                continue;            }             //相加小于6            else if (num + a[i] < b)             {                //num计数                num = num + a[i];                if (s == null)                 {                    s = a[i] + " ";                }                 else                 {                    s = s.concat(a[i] + " ");//字符链接在s之后                }            }             //等于6            else             {                System.out.print("["+ s + a[i] + "]");                num=0;                break;            }            diguiArrayNum(a, b, num, s);        }    }}

这个迭代程序中确实有错误,有兴趣的可以先不往下看,试着找找为什么会不输出3+3这个组合。
博主对java不太熟,电脑也没安java。So,把这个程序改成了C++代码,修正后的代码如下。能 成功输入2+2+2和3+3

#include<iostream>#include<string>#include<strstream>using namespace std;void diguiArrayNum(int a[], int b, int &num, string &s){        for (int i = 0; i <2; i++)        {        //等于6        if (num + a[i] == b)        {            std::cout << "[" << s << a[i] << "]" << std::endl;            s.clear();            break;        }        //相加直接小于6        else if (num + a[i] < b)        {            //num计数            num = num + a[i];            strstream ss;            ss << a[i];            string s1;            ss >> s1;            s = s + s1 + " ";//字符链接在s之后         }        //相加大于6        else if (num + a[i] > b)        {            num = a[i];            strstream ss;            ss << a[i];            string s1;            ss >> s1;            s = s1 + " ";            break;        }        diguiArrayNum(a, b, num, s);        }}int main(){    int a[2] = { 2, 3 };    int b =6;    int nums = 0;    string s;    std::cout << "b:" << b << std::endl;    diguiArrayNum(a, b, nums, s);    return 0;}

注意看代码,找一下差别,就明白,为没什么室友的代码输出结果不正确了(相加大于b时,室友的程序没跳出,so…..)
这里写图片描述
当b等于8时
这里写图片描述

注:虽然解决了室友的问题。但当b取有些值时,这个程序也会出错误,当b大于10时,程序会down掉,看来这个迭代程序并不通用,有兴趣的可以继续改进,精简一下代码~。(博主是懒得调试,改程序了,能懒则懒—_—)
总之,迭代真是博大精深啊~

0 0
原创粉丝点击