C++尋找陣列元素組合之和為給定數
阿新 • • 發佈:2019-01-23
問題描述: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掉,看來這個迭代程式並不通用,有興趣的可以繼續改進,精簡一下程式碼~。(博主是懶得除錯,改程式了,能懶則懶—_—)
總之,迭代真是博大精深啊~