问题描述:a=[2,3],b=6,将数组a中各个元素组合起来,让其和等于b。求这样的组合。
这道题很简单,组合有两种2+2+2 和 3+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掉,看来这个迭代程序并不通用,有兴趣的可以继续改进,精简一下代码~。(博主是懒得调试,改程序了,能懒则懒—_—)
总之,迭代真是博大精深啊~