1. 程式人生 > >C++尋找陣列元素組合之和為給定數

C++尋找陣列元素組合之和為給定數

問題描述: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掉,看來這個迭代程式並不通用,有興趣的可以繼續改進,精簡一下程式碼~。(博主是懶得除錯,改程式了,能懶則懶—_—)
總之,迭代真是博大精深啊~