2017-01-06 12 views
-2

I ont 2 tableaux:Toutes les combinaisons possibles sur 2 tableaux

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

Je veux faire l'utilisateur soit en mesure d'entrer un numéro de x et le programme doit imprimer toutes les multiplications possibles = x. la multiplication que = x devrait être faite de 2 nombres 1 du tableau A et l'autre nombre du tableau B. Les nombres ne peuvent pas être les mêmes.

J'ai cherché et la seule chose que je pense pourrait fonctionner est une boucle imbriquée. Je fais ce petit projet en C# mais je ne m'en soucie pas si c'est en Java que je comprends aussi Java. Merci d'avance pour l'aide.

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

_Je fais ce petit projet en C# _ Où est ton code? –

+2

Oui. Une boucle imbriquée fonctionnerait. Pourquoi n'essaies-tu pas d'en écrire une? (Si vous apprenez à programmer, vous en apprendrez plus/mieux si vous écrivez vous-même le code, ou au moins * essayez * ...) –

+0

Je pense que montrer l'approche de la boucle imbriquée et un exemple expliquerait le problème beaucoup mieux n'est pas clair –

Répondre

0

simple boucle imbriquée travaillerait pour cette

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); 
    } 
} 

Code non testé, mais qqch comme cela devrait fonctionner. vous devrez mettre en œuvre les tableaux pour vous-même :)

+0

Merci pour votre aide! – 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); 
     } 
    } 
} 


Voir une démonstration en direct here

Ce code accepte l'entrée d'utilisateur (réglé sur « 8 » à des fins de test) et boucle par les éléments du premier tableau et ensuite la boucle à travers le deuxième tableau.Une multiplication est effectuée pour chaque élément de la première par chaque élément de la seconde en utilisant cette logique de boucle imbriquée.

J'espère que cela vous a aidé d'une manière ou d'une autre.

+0

Merci pour votre aide, c'est très utile, mais un peu trop difficile pour moi :) – 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

* Cartésienne Joindre * - 'de x dans a de y dans b' - est la chose qui devrait être utilisée avec * care *. Que faire si les tableaux initiaux sont grands, disons, 'a = Enumerable.Range (0, 1000000) .ToArray();' et 'b = Enumerable.Range (0, 1000000) .ToArray()'? –

+0

Dennis_E merci pour votre aide, c'est simple et je comprends! – oscar6662

0

Je voudrais aller à la double boucle, comme le font quelques autres réponses. Si vous voulez éviter une boucle double (pour une raison particulière), cela peut être fait sans cela. En 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); 
      } 
     } 
    } 

Le code ci-dessus fonctionne pas pour x égal à 0, vous devez traiter ce cas particulier (que vous n'avez pas dans l'approche double boucle). Pour x égal à 8 empreintes de code:

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

Ole l'utilisateur entre un nombre et le programme est supposé trouver deux nombres un de chaque tableau: "a" et "b". a * b = entrée de l'utilisateur. a et b ne peuvent pas être le même nombre. // Quelqu'un peut-il m'aider, toujours quand j'appuie sur enter il soumet le commentaire mais je veux juste faire un espace! – oscar6662

+0

Ah, @ oscar6662, vous avez modifié la question. Merci de faire cela, je crois que cela devient plus clair. Si le problème est une entrée de console C#, je ne suis probablement pas le bon pour aider, cependant. Va vérifier les modifications à venir. –

+0

BTW J'ai testé et lu votre code mais je n'ai pas compris ce que ":" fait pour (int firstFactor: a) { – oscar6662

0

Je suggère d'utiliser Linq tout en évitant jointure cartésienne (si A et B sont grandes?):

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)); 

test

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

Résultat

2 5 
    5 2 

Stress test:

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

    int goal = 2016; 

retournera en quelques millisecondes

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

Merci monsieur pour votre aide! et le temps! – oscar6662

+0

@ oscar6662: vous êtes les bienvenus! –