给定6个整数和1个目标值,编写一个函数,使用6个整数来获取目标值,其中任意一个操作+,*, - ,/
这就是我做的事情
public class Solution {
public static void main(String[] args) {
int target =5;
int a[]={1,3,2,10,15,8};
int i,j;
for(j=0;j<6;j++)
for(i=0;i<6;i++)
if(a[i]/a[j]==target) System.out.println(a[i]+"/"+a[j]+"="+target);
for(j=0;j<6;j++)
for(i=0;i<6;i++)
if(a[i]+a[j]==target) System.out.println(a[i]+"+"+a[j]+"="+target);
for(j=0;j<6;j++)
for(i=0;i<6;i++)
if(a[i]*a[j]==target) System.out.println(a[i]+"*"+a[j]+"="+target);
for(j=0;j<6;j++)
for(i=0;i<6;i++)
if(a[i]-a[j]==target) System.out.println(a[i]+"-"+a[j]+"="+target);
}
}
我知道这是错误的,因为我一次只使用1个操作,我该怎么做才能同时执行多个操作。例如,如果它是一个复杂的数组,如{45,4,84,63,91,20,400},而我的目标值是455,即(91 * 20)/ 4,那么我的程序怎么做呢?它如何尝试所有可能的操作?
答案 0 :(得分:1)
在我看来,您正试图为Countdown numbers game编写解算器。
这不是一项微不足道的任务,而且你通常最终会得到一个强大的“蛮力”。搜索运行多种组合。我之前曾为它写过解决方案,但我很难在20分钟内写出一个。
这里有一些我希望说明过程的伪代码。我假设你的所有数字都是正数:
// Assume numbers is sorted in ascending order
// progress_so_far lists the steps we have taken to get the solution.
void search(numbers, progress_so_far, target) {
for each a in numbers {
for each b in numbers after a {
for each op in + - * / {
if (b op a is valid) {
result = b op a;
if (result == target) {
// Success !
// Print out how we got there.
}
else if (numbers.size() > 2) {
new_numbers = copy of numbers with a and b removed and result added, sorted in ascending order;
new_progress = copy of progress_so_far with 'b op a' added;
search(new_numbers, new_progress, target);
}
}
}
}
}
}
按b op a is valid
,我的意思是计算不是减法,导致零或具有非零余数的除法。由于数字按升序排序,而b
位于列表a
之后,b
将大于或等于a
。通过实施此限制,我们可以避免重复工作,这要归功于+
和*
的交换,最后是-
的负数。
我们还可以检查并过滤掉“无用的”&#39;乘以或除以1,减法(如8 - 4(其中包括&#39; 8))或25/5(其中&#39;浪费&25; 25)这样的除法等操作。 / p>
一旦找到目标,您可能希望继续查看是否可以使用更少的步骤击中目标。第一次找到目标时可能存在冗余步骤;通过搜索最短的,你保证删除这些。