Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [pascal] numeri primi

  1. #1

    [pascal] numeri primi

    Scrivere un programma che verifichi se due numeri A e B sono primi fra loro (cioè quando non hanno divisori in comune eccetto i lnuemro 1).
    Aiutatemi please

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Un po' spartano, magari, e probabilmente migliorabile dal punto di vista dell'efficienza, però il suo lavoro lo fa ed è anche molto semplice:
    codice:
    Program DivisoriPrimi;
    
    Uses Crt;
    
    Var a:integer; (* primo numero *)
        b:integer; (* secondo numero *)
        tmp:integer; (* variabile che conterrà l'i-esimo divisore *)
        min: integer; (* il minimo fra a e b *)
        max: integer; (* il massimo fra a e b *)
        trovato: boolean; (* flag: true se esiste un divisore comune *)
    
    Begin
       clrscr;
       Write('Introdurre primo valore: ');
       Readln(a);
       Write('Introdurre secondo valore: ');
       Readln(b);
       If (a<b) Then
        Begin
          min := a;
          max := b;
        End
       Else
        Begin
          min := b;
          max := a;
        End;
    
       trovato := false;
       tmp := min;
       While (Not(Trovato) And (tmp > 1)) do
       Begin
          If (((min mod tmp) = 0) and ((max mod tmp) = 0)) Then
             trovato := true
          Else
             tmp := tmp - 1;
       End;
    
       If (trovato) Then
          Writeln('I due numeri non sono primi tra di loro: ',tmp,' li divide!')
       Else
          Writeln('I due numeri sono primi tra di loro!');
       
    End.
    Spiegazione: trova il minimo fra 'a' e 'b' così da "ottimizzare" la ricerca di un divisore (basta provare quelli più piccoli o al massimo uguali al minimo fra i due numeri: un numero non può dividerne uno più piccolo ).
    Poi comincia a provare a dividere sia 'a' sia 'b' per tutti i valori a partire dal minimo fino ad arrivare a 1 (escluso, so già che li dividerà entrambi). Se ne trova uno che li divide entrambi pone 'trovato' a true ed esce dal ciclo, altrimenti esce con 'tmp' = 1 che significa che non ne esistono.

    Per speigazioni ulteriori sono qui!

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Sei un grande, spero di poter ricambiare

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Ma non c'è di che... volendo si potrebbe ottimizzare il codice in modo da non dover controllare per tutti i numeri minori al minimo fra 'a' e 'b', ma solamente controllare per i numeri inferiori alla radice del minimo. La cosa, poi, potrebbe essere applicata ricorsivamente ma diventa un po' ingestibile.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.