给定6个整数和1个目标值,编写一个函数来获取目标值,使用6个整数与任何这些操作,*, - ,/

时间:2013-03-30 17:58:34

标签: java

给定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,那么我的程序怎么做呢?它如何尝试所有可能的操作?

1 个答案:

答案 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>

一旦找到目标,您可能希望继续查看是否可以使用更少的步骤击中目标。第一次找到目标时可能存在冗余步骤;通过搜索最短的,你保证删除这些。