所以让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);
}
}
}
}
}
答案 0 :(得分:5)
如果有人要求您解决x + 1 == 2
等式,您是否会尝试遍历x
的所有可能值以查看哪一个适合?我希望不是。您可能会发现该等式允许立即直接分析解x = 2 - 1 = 1
。
同样的逻辑适用于您的情况。了解a
,b
和c
后,您的a + b == c + d
等式可以直接解决d
:d = 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);
}
}