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

本文解决了一个简单的程序问题:给定数组a=[2,3]及目标值b=6,使用迭代法找出数组元素的所有组合方式,使组合之和等于b。文章提供了初始的Java程序及其C++版本的修正代码,并探讨了程序的局限性和改进方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述: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掉,看来这个迭代程序并不通用,有兴趣的可以继续改进,精简一下代码~。(博主是懒得调试,改程序了,能懒则懒—_—)
总之,迭代真是博大精深啊~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值