2017-01-06 3 views
-2

У меня 2 Массивы:Все возможные комбинации из 2 Массивы

A {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 
    B {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 

Я хочу, чтобы пользователь сможет ввести номер х, а затем программа должна вывести все возможные умножений, что = x. умножение, которое = x должно быть сделано из 2 чисел 1 массива A и другого числа из массива B. Цифры не могут быть одинаковыми.

Я искал и единственное, что, я думаю, мог бы работать, это вложенный цикл. Я делаю этот маленький проект в C#, но мне все равно, если он в Java, я понимаю также Java. Заранее спасибо за помощь.

int num_user; 
     int[] x = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }; 
     int[] y = new int[9]; 
     Console.WriteLine("Hello please input the number you think could be the solution :) "); 
     num_user = Convert.ToInt32(Console.ReadLine()); 
     for (int a = 0; a < x.Length; a++) 
      for (int b = 0; b < y.Length; b++) 
       if num_user == a*b //and here is where I get lost 
+3

_ Я делаю этот маленький проект в C# _ Где ваш код? –

+2

Да. Вложенная петля будет работать. Почему бы вам не попробовать написать? (Если вы учитесь программировать, вы узнаете больше/лучше, если вы сами напишете код. Или, по крайней мере, * попробуйте * ...) –

+0

Я думаю, что показ подхода с вложенным циклом, и в каком-то примере это объяснит проблему намного лучше не ясно –

ответ

0

простой вложенный цикл будет работать для этого

for (int x = 0; x < 10; x++) 
{ 
    for (int y = 0; y < 10; y++) 
    { 
     if (x != y && x*y == your_number) System.out.format("%d * %d = %d\n",x,y,your_number); 
    } 
} 

код не проверял, но STH, как это должно работать. вы должны реализовать массивы для себя :)

+0

Спасибо за помощь! – oscar6662

0
using System; 
using System.Collections.Generic; 

public class Test 
{ 
    public static void Main() 
    { 
     string input = string.Empty; 
     int output = 0; 
     do 
     { 
      Console.WriteLine("Enter number: "); 
      input = /* Console.ReadLine(); */ "8"; 
     } while (!int.TryParse(input, out output)); 
     int[] first = new int[] {0,1,2,3,4,5,6,7,8,9}; 
     int[] second = new int[] {0,1,2,3,4,5,6,7,8,9}; 
     var list = new List<string>(); 
     for (int i = 0; i < first.Length; i++) 
      for (int j = 0; j < second.Length; j++) 
       if (first[i] * second[j] == output) 
        list.Add(first[i] + " x " + second[j] + " = " + output); 
     foreach (var str in list) { 
      Console.WriteLine(str); 
     } 
    } 
} 


Смотрите демонстрацию here

Этот код принимает пользовательский ввод (установите «8» для целей тестирования) и будет Переберите первые элементы массива, а затем цикл через второй массив. Умножение выполняется для каждого элемента в первом по каждому элементу во втором, используя эту логику вложенного цикла.

Надеюсь, вам это помогло.

+0

Спасибо за вашу помощь, это очень полезно, но слишком сложно для меня :) – oscar6662

2
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
int[] b = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

int target = 5; //The number you want the 2 numbers to multiply to 

var query = 
    from x in a 
    from y in b 
    where y != x && x * y == target 
    select new { x, y }; 

foreach (var pair in query) Console.WriteLine(pair); 
+0

* Cartesian Join * - 'from x in a from y in b' - это то, что нужно использовать с * care *. Что делать, если начальные массивы большие, скажем, 'a = Enumerable.Range (0, 1000000) .ToArray();' и 'b = Enumerable.Range (0, 1000000) .ToArray()'? –

+0

Dennis_E спасибо за вашу помощь, это просто, и я понял! – oscar6662

0

Я бы выбрал двойную петлю, как это делают пара других ответов.

Если вы хотите избежать двойной петли (по какой-то определенной причине), это можно сделать без нее. В Java:

int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    // not using b 

    int x = 8; 

    for (int firstFactor : a) { 
     if (firstFactor != 0 && x % firstFactor == 0) { 
      int secondFactor = x/firstFactor; 
      if (0 <= secondFactor && secondFactor <= 9 && secondFactor != firstFactor) { 
       System.out.println("" + firstFactor + " * " + secondFactor); 
      } 
     } 
    } 

Код выше не работает x, равным 0, вы должны относиться к этому делу специально (которые вы не должны в подходе двойного цикла). Для x равных 8 кодовых гравюр:

1 * 8 
2 * 4 
4 * 2 
8 * 1 
+0

Ole пользователь вводит число, и программа судится, чтобы найти два числа по одному из каждого массива: «a» и «b». a * b = ввод пользователя. a и b не могут быть одинаковыми. // может кто-нибудь мне помочь, всегда, когда я нажимаю кнопку ввода, он отправляет комментарий, но я просто хочу сделать пробел! – oscar6662

+0

Ах, @ oscar6662, вы отредактировали вопрос. Спасибо за это, я считаю, что это становится яснее. Если проблема связана с консольным входом C#, я, вероятно, не всегда прав, чтобы помочь. Будет проверять любые предстоящие изменения. –

+0

BTW Я тестировал и читал ваш код, но я не получил то, что «:» делает для (int firstFactor: a) { – oscar6662

0

Я предлагаю использовать Linq, избегая при этом декартовой Регистрация (что если A и B велики?):

int[] A = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    int[] B = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

    int goal = 10; 

    var result = A 
    .Where(a => a != 0 && goal % a == 0) // a from A is divider of the goal 
    .Where(goal/a != a)    // a and b can't be the same 
    .Where(a => B.Contains(goal/a)) // b is in B 
    .OrderBy(a => a)      // let be nice 
    .Select(a => string.Format("{0} {1}", a, goal/a)); 

Тест

Console.Write(string.Join(Environment.NewLine, result)); 

Результат теста

2 5 
    5 2 

Stress:

int[] A = Enumerable.Range(0, 1000000).ToArray(); 
    int[] B = Enumerable.Range(0, 1000000).ToArray(); 

    int goal = 2016; 

вернется в миллисекундах

1 2016 
2 1008 
3 672 
4 504 
6 336 
7 288 
8 252 
9 224 
... 
504 4 
672 3 
1008 2 
2016 1 
+0

Спасибо, сэр за вашу помощь! и время! – oscar6662

+0

@ oscar6662: добро пожаловать! –