用于找到" a + b = c + d"的解决方案的更好算法

时间:2014-02-28 20:49:57

标签: algorithm

所以让abcd是1000到9999之间的数字,a,b,c,d是它的数字。 所以找到数字,其中a + b = c + d。有一个解决方案,有四个循环,但我需要 一个有三个循环的解决方案。

for (int a = 1; a <= 9; a++)
{
    for (int b = 0; b <= 9; b++)
    {
        for (int c = 0; c <= 9; c++)
        {
            for (int d = 0; d <= 9; d++)
            {
                if ((a + b) == (c + d))
                {
                    Console.WriteLine(" " + a + " " + b + " " + c + " " + d);
                }
            }
        }
    }
}

5 个答案:

答案 0 :(得分:5)

如果有人要求您解决x + 1 == 2等式,您是否会尝试遍历x的所有可能值以查看哪一个适合?我希望不是。您可能会发现该等式允许立即直接分析解x = 2 - 1 = 1

同样的逻辑适用于您的情况。了解abc后,您的a + b == c + d等式可以直接解决dd = a + b - c。没有必要迭代d,就像没有必要在x中迭代x + 1 == 2一样。

答案 1 :(得分:2)

前3个循环为a,b和c建立值。知道这个和你的等式只是计算d需要是什么,以使你的方程成立。然后检查为d计算的数字是否有效。

 for (int a = 1; a <= 9; a++)
 {
    for (int b = 0; b <= 9; b++)
    {
       for (int c = 0; c <= 9; c++)
       {
          d = a + b - c;
          if (d <= 9 && d >= 0) 
          {
             Console.WriteLine(" " + a + " " + b + " " + c + " " + d);
          }
        }
     }
   }

答案 2 :(得分:0)

你有一个特殊的4SUM案例可以通过一种方法来解决3SUM,使其成为O(N ^ 2)。虽然它需要使用一些数据结构。

首先要注意的是,由于您正在寻找A + B = C + D,您真正想要做的是找到一对数字对,这些数字加起来为某个数字S.

你可以简单地通过一个map / dict,其中键是和,它映射到一个等于该总和的对列表。结果是:

S = [(a,b),(c,d),(e,f),...] for a number of values of S

这相当于说:

a + b = c + d = e + f = ... = S for a number of values of S

然后,您只需浏览每个总和并删除列表中只有一个元素的那些。

我认为你可以打破通过对的组合来获得诸如a + b = c + d和c + d = e + f之类的东西,只需花费额外的O(N ^ 2)由于您可以获得总和的方式有限制,因此没有重复项。虽然,我可能是错的,需要O(N ^ 3)列出该形式的解决方案。

答案 3 :(得分:0)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            var number = Enumerable.Range(1000, 9000);
            var list = from y in number
                       let a = y / 1000
                       let b = (y - 1000 * a) / 100
                       let c = (y - 1000 * a - 100 * b) / 10
                       let d = (y - 1000 * a - 100 * b - 10 * c)
                       where a + b == c + d
                       select y;
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
            Console.Read();
        }
    }
}

答案 4 :(得分:0)

String s1;
Set<String> s=new TreeSet();
for( int i=1;i<10;i++)
{
   s1=null;
    s1=""+i;
    for(int j=0;j<10;j++)
    {
       String tempj=s1;
        s1=s1+j;
        for(int k=0;k<10;k++)
        {
            String tempk=s1;
        s1=s1+k;
        int temp=i+j-k;
        s1=s1+temp;
        if(temp<10)
        s.add(s1);
        s1=tempk;
        }
      s1=tempj;  
    }

}

for(String i:s )
System.out.println(i+);

----------------------------------------------- -----------------编辑1 ------------------

import java.util.*;
public class HelloWorld{

 public static void main(String []args){
  String happyNumber;
 Set<String> numberSet=new TreeSet();
 for( int i=1;i<10;i++)
    {
    happyNumber=null;           //Every 1st loop will give a new number so old one has to be deleted
    happyNumber=""+i;           //Adding the number in 1st place (place value will be i*10000)
    for(int j=0;j<10;j++)       //Loop for putting nmber in 1000th place
        {
            String tempj=happyNumber;    //taking happyNumber( only one digit fixed till now) into a temp variable to permutate on other places
            happyNumber=happyNumber+j;   //Attaching another number after this we have (AB)
            for(int k=0;k<10;k++)        //permutating with value of c and calculating d    
                {
                    String tempk=happyNumber; 
                    happyNumber=happyNumber+k;  //Attaching variable for 3rd place (c)
                    int temp=i+j-k;             //calculating value of d
                    if(temp<10)                 //checking whether we have right value for d 
                        {
                        happyNumber=happyNumber+temp;
                        numberSet.add(happyNumber);
                        }
                    happyNumber=tempk;          //bringing number back to its previous state for more combination
                }
                happyNumber=tempj;              //bringing number back to its previous state for more combination
        }

    }

    for(String i:numberSet )
    System.out.println(i);
    }
}