取a数组里面的8个数字!让他们结果相加等于1979970

寻找特定组合
本文介绍了一个Java程序示例,该程序旨在从一组给定的整数中找出特定数量的数(本例为8个),使这些数相加的结果等于指定的目标值(本例为1979970)。通过多层循环实现对数组元素的遍历和条件判断。
public class BaiduDemo00 {


/**
* @author 州伟
* @param args
* int[] a = { 757390, 300725, 864050, 105300, 206640, 16640, 47790,
66560, 70400, 17700, 34220, 24780, 217050, 29250, 83550,
381600, 313440, 109740, 222610, 215830, 157200, 34100, 379500,
189745 };


取a数组里面的8个数字!让他们结果相加等于1979970
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = { 757390, 300725, 864050, 105300, 206640, 16640, 47790,
66560, 70400, 17700, 34220, 24780, 217050, 29250, 83550,
381600, 313440, 109740, 222610, 215830, 157200, 34100, 379500,
189745 };
int[] b = queryints(a);
for(int i=0; i<b.length; i++){
System.out.println("第" + (i+1) + "个数是:" + b[i]);
}
System.out.println("和:" + (b[0]+b[1]+b[2]+b[3]+b[4]+b[5]+b[6]+b[7]));
}


private static int[] queryints(int[] a){
for(int j=0; j<a.length; j++){
int[] c = new int[8];

c[0] = a[j]; //第一个数
for(int j1=0; j1<a.length-1;j1++){
if(c[0] != a[j1]){
c[1] = a[j1]; //第二个数
for(int j2=0; j2<a.length-2;j2++){
if(c[0] != a[j2] && c[1] != a[j2]){
c[2] = a[j2]; //第三个数
for(int j3=0; j3<a.length-3;j3++){
if(c[0] != a[j3] && c[1] != a[j3] && c[2] != a[j3]){
c[3] = a[j3]; //第四个数
for(int j4=0; j4<a.length-4;j4++){
if(c[0] != a[j4] && c[1] != a[j4] && c[2] != a[j4] && c[3] != a[j4]){
c[4] = a[j4]; //第五个数
for(int j5=0; j5<a.length-5;j5++){
if(c[0] != a[j5] && c[1] != a[j5] && c[2] != a[j5] && c[3] != a[j5] && c[4] != a[j5]){
c[5] = a[j5]; //第六个数
for(int j6=0; j6<a.length-6;j6++){
if(c[0] != a[j6] && c[1] != a[j6] && c[2] != a[j6] && c[3] != a[j6] && c[4] != a[j6] && c[5] != a[j6]){
c[6] = a[j6]; //第七个数
for(int j7=0; j7<a.length-7;j7++){
if(c[0] != a[j7] && c[1] != a[j7] && c[2] != a[j7] && c[3] != a[j7] && c[4] != a[j7] && c[5] != a[j7] && c[6] != a[j7]){
c[7] = a[j7]; //第七个数
if(c[0]+c[1]+c[2]+c[3]+c[4]+c[5]+c[6]+c[7] == 1979970){
return c;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
return a;
}

}
<think>好的,我现在要解决用户的问题,也就是在Excel中写一个公式,满足以下需:表1的E8单元格里有12两个数,代表表2中的项目ID。每个ID对应的行里的D列记录了该项目的收入。需要根据E8里的所有ID,查找表2中对应的收入,将这些收入相加,然后乘以表1的F8的值,得到最终结果。 首先,我需要明确用户的具体需。用户提到E8中有两个数,12,这两个数是项目ID,位于表2中。每个ID所在行的D列是收入,需要将这些收入相加,再乘以F8的值。所以,关键在于如何从E8中提多个ID,并在表2中查找对应的收入,然后再相乘。 接下来,我需要考虑Excel中处理这种情况的常用函数。用户之前的问题中提到了FILTERTEXTJOIN,但这次可能需要使用SUMIFS或者SUMPRODUCT来进行条件。另外,E8中的数值是两个数字,但用户可能需要处理更一般的情况,比如E8中包含多个用逗号分隔的ID,或者用其他分隔符分隔的列表。不过,根据用户当前的描述,E8中有12两个数,可能是指这两个数直接放在E8单元格里,用逗号分隔,或者分开放置在相邻的单元格中。但根据常规情况,可能E8是一个单元格,里面存储了用逗号分隔的12,比如“1,2”。这时候,需要将这两个ID分开,然后分别查找对应的收入,再相加。 如果是这种情况,那么需要将E8中的文本拆分成单独的ID,然后逐个查找。这时候可能需要使用TEXTSPLIT函数(如果版本支持)或者用其他方法拆分字符串。然后,对每个ID使用SUMIF或者SUMIFS函数来,最后将所有的相加,再乘以F8。 但用户可能使用的是较新版本的Excel,比如Office 365,这样可以使用动态数组函数。例如,FILTER函数可以返回多个匹配项,然后用SUM,再乘以F8。但需要处理的是如何将E8中的多个ID转换为一个数组,用于FILTER的条件。 另外,用户提到“通过E8格中所有数”,可能E8中的数值是用逗号分隔的字符串,例如“1,2”,或者以其他方式存储的多个值。如果是用逗号分隔的,需要先将其拆分为数组,然后进行匹配。例如,使用TEXTSPLIT(E8, ",")来分割,然后转换为数值,再作为条件。 假设E8中的内容是文本“1,2”,那么首先需要将这两个ID分开,转换成数组{1,2}。然后,在表2中查找项目ID等于这两个值的行,然后D列的值相加。这时候,可以使用SUMIFS函数,其中条件区域是表2的项目ID列,条件是这个数组中的每个元素。或者,使用SUMPRODUCT函数,将条件区域与数组中的每个元素进行比较,然后。 或者,使用SUMSUMIF的组合,例如,SUM(SUMIF(表2!A:A, {1,2}, 表2!D:D)),这样可以对多个条件进行。不过,这需要将E8中的内容转换为数组{1,2},但如何动态地将E8中的内容转换为数组呢? 如果用户手动输入数组,比如在E8中输入12在不同的单元格中,那么公式会更简单。但用户明确说E8格中有1,2两个数,所以可能是在同一个单元格中用逗号分隔的字符串。这时候,需要先拆分这个字符串,再转换为数组。 在这种情况下,可能需要使用TEXTSPLIT函数将E8的内容拆分成两个单元格,或者使用其他函数来生成数组。例如,对于Office 365用户,可以使用TEXTSPLIT(E8, ",")来分割,然后用VALUE函数转换为数值。然后,将这个数组作为条件,使用SUMIFS或SUMPRODUCT进行。 假设E8中是“1,2”,那么公式可能是: =SUM(SUMIF(表2!A:A, VALUE(TEXTSPLIT(E8, ",")), 表2!D:D)) * F8 但需要确认TEXTSPLIT是否返回横向数组,而SUMIF的第二个参数是否接受数组。或者,使用SUMPRODUCT,将每个拆分后的ID与表2的项目ID进行比较,然后乘以对应的收入,再。 另一个方法是使用FILTER函数,筛选出表2中项目ID在E8拆分后的数组中的行,然后对D列。 例如: =SUM(FILTER(表2!D:D, ISNUMBER(MATCH(表2!A:A, VALUE(TEXTSPLIT(E8, ",")), 0)))) * F8 这里,MATCH函数会返回每个表2项目ID在E8拆分后的数组中的位置,如果存在则返回数字,否则错误。ISNUMBER判断是否存在,FILTER返回对应的D列值,然后。 但需要注意,表2的项目ID列(假设是A列)需要是数值类型,而TEXTSPLIT拆分后的结果是文本,需要用VALUE转换为数值。 另外,如果用户使用的是较旧版本的Excel,可能不支持TEXTSPLIT或FILTER函数,这时候可能需要使用更复杂的方法,比如使用SUBSTITUTEMID函数来拆分字符串,或者使用VBA自定义函数。 不过根据用户之前的问题,他们可能使用的是较新的版本,比如支持动态数组的Office 365,因此推荐使用FILTER或SUMIFS的组合。 另外,需要确保表2的项目ID列的正确引用,例如,如果项目ID在表2的A列,那么引用表2!A:A,收入在D列,引用表2!D:D。 最后,将后的结果乘以表1的F8单元格的值,即*F8。 总结可能的公式: 1. 使用TEXTSPLITSUMIF: =SUM(SUMIF(表2!A:A, VALUE(TEXTSPLIT(E8, ",")), 表2!D:D)) * F8 2. 使用FILTERSUM: =SUM(FILTER(表2!D:D, ISNUMBER(MATCH(表2!A:A, VALUE(TEXTSPLIT(E8, ",")), 0)))) * F8 但需要确认是否支持这些函数,并且是否正确处理数组。 另外,如果E8中的数字是用其他分隔符,比如空格,需要调整TEXTSPLIT的分隔符参数。 在步骤说明中,需要详细说明每个函数的作用,比如TEXTSPLIT用于拆分字符串,VALUE转换为数值,SUMIF或FILTER进行条件筛选,SUM,最后乘以F8。 还需要注意错误处理,例如如果E8中的内容无法正确拆分,或者项目ID不存在,是否返回0或其他提示。 可能还需要提到,如果项目ID在表2中重复出现,SUMIF会将这些收入相加,而FILTER则会包括所有匹配的行,然后SUM,效果相同。 另外,性能方面,如果表2数据量很大,使用整列引用(如A:A)可能会影响性能,建议使用具体的范围,例如A2:A1000。 最后,给出示例,假设E8是“1,2”,表2中项目ID为1的收入是100,项目ID为2的收入是200,那么公式计算结果为(100+200)*F8的值。 需要确保公式中的引用正确,例如表名是否正确,是否需要单引号,例如如果表名有空格,需要使用'表2'!A:A。 综上,最终的公式可能是: =SUM(SUMIF(表2!A:A, --TEXTSPLIT(E8,,","), 表2!D:D)) * F8 或者更简洁的写法,使用SUMPRODUCT: =SUMPRODUCT(表2!D:D * ISNUMBER(MATCH(表2!A:A, --TEXTSPLIT(E8,,","), 0))) * F8 但需要确认是否正确处理数组。 可能需要用双负号(--)将TEXTSPLIT的结果转换为数值,或者使用VALUE函数。 此外,如果用户使用的是Excel 365,可能还可以使用LET函数来简化公式: =LET( ids, VALUE(TEXTSPLIT(E8, ",")), sum_income, SUM(SUMIF(表2!A:A, ids, 表2!D:D)), sum_income * F8 ) 这样更易读。 在注意事项中,需要提到: - 确保E8中的ID以逗号分隔,无空格。 - 表2的项目ID列收入列的正确引用。 - 如果无匹配项,公式返回0,可能需要添加错误处理,但用户可能希望直接得到0,所以可能不需要。 - 版本兼容性,如TEXTSPLITFILTER需要较新的Excel版本。 最后,给出示例,比如E8是1,2,表2中ID1的D列是100,ID2的是200,F8是2,结果就是(100+200)*2=600。</think>--- ### **解决方案** 根据需,推荐使用以下 Excel 公式: ```excel =SUM(SUMIF(表2!A:A, --TEXTSPLIT(E8,,","), 表2!D:D)) * F8 ``` **分步说明**: 1. **拆分 E8 中的 ID** ```excel TEXTSPLIT(E8,,",") ``` - 作用:将 E8 单元格中逗号分隔的 "1,2" 拆分为横向数组 `{"1","2"}`。 - `--` 运算符:将文本型数字转为数值,得到 `{1,2}`。 2. **按 ID 匹配并** ```excel SUMIF(表2!A:A, {1,2}, 表2!D:D) ``` - 作用:在表2的A列(项目ID列)中,查找所有等于1或2的行,并累加对应D列(收入列)的值。 - 结果为 `收入1 + 收入2`(如 `100 + 200 = 300`)。 3. **汇总并乘以 F8** ```excel SUM(...) * F8 ``` - 将匹配到的收入总乘以表1的F8单元格值,得到最终结果。 --- ### **示例演示** 假设数据如下: - **表1 E8**: `1,2`,**F8**: `2` - **表2 数据**: | A列(项目ID) | D列(收入) | |-------------|-----------| | 1 | 100 | | 2 | 200 | | 3 | 50 | **公式计算过程**: 1. 拆分 E8 得到 `{1,2}`。 2. 匹配表2中ID为12的收入:`100 + 200 = 300`。 3. 结果乘以 F8:`300 * 2 = 600`。 --- ### **注意事项** 1. **ID分隔符** - 确保E8中的ID以逗号分隔(如 `1,2`),不含空格或其他符号。 2. **数据类型匹配** - 若表2的A列为文本型数字,需将公式中的 `--TEXTSPLIT(...)` 改为 `TEXTSPLIT(...)`。 3. **性能优化** - 避免引用整列(如 `A:A`),改为具体范围(如 `A2:A100`)以提高速度。 4. **无匹配项处理** - 若未找到匹配项,公式返回 `0`。 --- ### **替代公式(动态数组版)** 若使用 Office 365,可用以下更简洁公式: ```excel =SUM(FILTER(表2!D:D, ISNUMBER(MATCH(表2!A:A, --TEXTSPLIT(E8,,","), 0)))) * F8 ``` 此公式通过 `FILTER` 直接筛选匹配项,逻辑更直观。 根据实际 Excel 版本选择即可。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值