1

Ceci est un programme Java pour trouver le nombre avec les plus grands diviseurs de 1-500000.Ce programme de threads me montre des réponses différentes à chaque fois

public class Medium2 { 
    static int count1 = 1; 
    static int count2 = 1; 
    static int big_count = 0; 
    static int big = 0; 

Méthode principale

public static void main(String[] args) { 
    Runnable runnable1 = new Runnable() { 
     public void run() { 

La mise en œuvre va ici

for (int num = 1; num <= 500000; num++) { 
     for (int i = 2; i <= num; i++) { 
     if (num % i == 0) { //Actual Logic 
      count1++; 
     } 
     } 
     if (count1 > big_count) { 
     big_count = count1; //Number of Divisors 
     big = num; //Largest Number 
     } 
     count1 = 1; 
    } 
    } 
}; 

Et l'exécution du thread

Thread thread1 = new Thread(runnable1); //Threads 
Thread thread2 = new Thread(runnable1); 
thread1.start(); 
thread2.start(); 
try { 
    thread1.join(); 
    thread2.join(); 
} catch (InterruptedException ie) { 
    ; 
} 
System.out.println("Biggest: " + big + "\nNumber of Divisors for " + big + " = " + big_count); 
    } 
} 

Mais il donne des réponses différentes à chaque fois. La réponse est: 498960 et 200 Divisors

+2

"la réponse réelle est:" ... non, ce n'est pas le cas. la réponse réelle dépend de la course, pas de ce que vous pensez. vous obtenez des résultats différents, car chaque fois il y a des résultats différents – Stultuske

+4

D'où vient le "mais"? Votre programme est à fond dans les courses de données. –

+0

thread donnera résultat différent sur les différentes courses –

Répondre

0

En ce qui concerne votre objectif, votre implémentation devrait probablement avoir des problèmes. Puisque big_count et big est commun pour les deux threads et n'ont aucune protection lorsque les threads essaient de les modifier, votre programme devrait créer des erreurs.

Autre que cela, vous n'êtes pas non plus en utilisant 2 fils, puisque les deux fils sont en train de faire le calcul de 1 à 500000

Depuis votre logique de calcul semble ok, vous devriez obtenir votre sortie désirée lorsque vous essayez avec un seul fil .

Si vous le voulez faire par deux threads, vous pouvez facilement essayer ceci. (Juste pour vérifier, pas la plus belle façon)

  • Vous devriez avoir big_count1, big1 et big_count2, big2. Ainsi, les variables dont les noms se terminent par '1' n'utilisent que thread1 et les variables dont le nom se termine par '2' n'utilisent que thread2.

  • Assigner Thread1 pour vérifier 1-250000 et thread2 à partir de 250001 à 500000

  • Après join() s, il suffit de comparer big_count1 et big_count2, alors vous pouvez déduire la réponse finale. :))