Visualizzazione risultati 1 fino 9 di 9

Discussione: "contare" un valore in una variabile

  1. #1
    Guest

    Predefinito "contare" un valore in una variabile

    Salve.
    Stò cercando di fare una funzione che scomponga un numero in fattori primi.
    Quella che ho scritto funziona, ma c'è un problema.
    Esempio di output:
    Codice:
    12 | 2
    6 | 2
    3 | 3
    1
    2 x 2 x 3
    Io vorei che la formuletta in basso sia 2^2 x 3.
    Ecco il codice:
    Codice PHP:
    <?php
    function test($n)
    {
    $prime = 1;
    if (
    $n == 2) return $prime;
    $a = $n % 2;
    if (
    $a == 0) return 0;
    for (
    $i=3;$i<$n;$i+=2) {
    $q = $n % $i;
    if (
    $q == 0) {
    $prime = 0;
    break;
    }
    }
    return
    $prime;
    }
    function
    prime($n)
    {
    $i = 2;
    $j = 0;
    echo
    "<code>\n";
    while(
    $n > 1) {
    if((
    $n % $i == 0) && (test($i) == 1)) {
    if(
    $n < 10) {
    echo
    "0".$n." | ".$i."<br>";
    } else {
    echo
    $n." | ".$i."<br>";
    }
    $n /= $i;
    if(
    $n == 1) {
    $str[$j] .= $i;
    } else {
    $str[$j] .= $i." x ";
    }
    $i = 2;
    $j++;
    } else {
    $i++;
    }
    if(
    $n == 1) {
    echo
    "1<br><br>";
    }
    }
    echo
    implode("",$str);
    echo
    $str2;
    echo
    "</code>\n";
    }
    prime(41111);
    ?>
    Tutti i valori sono messi in'un'array, ma non so come fare per riconoscere se ci sono n valori uguali e raggrupparli

  2. #2
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Mi permetto di suggerirti un algoritmo molto più semplice (forse anche un pelo più efficiente: se esamini i candidati divisori in ordine crescente, che motivo hai di verificare se un numero è primo, dato che se trovi che un numero A non divide B, allora nemmeno un multiplo di A divide B?):
    Codice PHP:
    function fattorizza ($numero)
    {
    $quoziente = $numero;
    $divisore = 2;
    $fattori = array ();
    while (
    $divisore <= sqrt ($quoziente))
    {
    if (
    $quoziente % $divisore == 0)
    {
    $fattori[] = $divisore;
    $quoziente /= $divisore;
    }
    else
    $divisore++;
    }
    $fattori[] = $quoziente;
    return
    $fattori;
    }

    function
    print_fattori ($numero)
    {
    $fattori = fattorizza ($numero);
    $x = $fattori[0];
    $m = 1;
    echo (
    $fattori[0]);
    for (
    $i = 1; $i < count ($fattori); $i++)
    {
    if (
    $fattori[$i] == $x)
    {
    $m++;
    }
    else
    {
    if (
    $m > 1) echo ('^' . $m);
    $m = 1;
    $x = $fattori[$i];
    echo (
    ' * ' . $x);
    }
    }
    if (
    $m > 1) echo ('^' . $m);
    }
    Non l'ho testato, ma dovrebbe funzionare... e stamparti pure i fattori con l'esponente e in ordine crescente.

    Stammi bene...
    Ultima modifica di dementialsite : 28-10-2008 alle ore 19.55.47 Motivo: Correzione - vedi post #4
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  3. #3
    Guest

    Predefinito

    Ho provato a fare print_fattori(144) ed ecco l'output:
    Codice:
    2^4 * *
    Pagina di prova: http://crashinside.net/esempi/prova.php

  4. #4
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Ho fatto la "tabella di traccia" con 144 e funziona... però nel codice sopra (ora corretto) ho dimenticato un $, prova a vedere se inserendolo il problema si risolve...

    Stammi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  5. #5
    Guest

    Predefinito

    Grazie, ma con un po' di ingegno ho risolto mantenendo il mio codice
    Ecco il codice corretto:
    Codice PHP:
    <?php
    function search($count,$array){
    $result=0;
    for (
    $i=0;$i<count($array);$i++){
    if (
    $array[$i] == $count) {
    $result++;
    }
    }
    return
    $result;
    }
    function
    test($n)
    {
    $prime = 1;
    if (
    $n == 2) return $prime;
    $a = $n % 2;
    if (
    $a == 0) return 0;
    for (
    $i=3;$i<$n;$i+=2) {
    $q = $n % $i;
    if (
    $q == 0) {
    $prime = 0;
    break;
    }
    }
    return
    $prime;
    }
    function
    prime($n)
    {
    $no = $n;
    $i = 2;
    $j = 0;
    echo
    "<code>\n";
    while(
    $n > 1) {
    if((
    $n % $i == 0) && (test($i) == 1)) {
    if(
    $n < 10) {
    echo
    "0".$n." | ".$i."<br>";
    } else {
    echo
    $n." | ".$i."<br>";
    }
    $n /= $i;
    $str[$j] .= $i;
    $i = 2;
    $j++;
    } else {
    $i++;
    }
    if(
    $n == 1) {
    echo
    "1<br><br>";
    }
    }
    for(
    $aa=0;$aa<=count($str);$aa++) {
    $c[$aa] = search($str[$aa],$str);
    }
    echo
    $no." = ";
    for(
    $b=0;$b<count($str);$b++) {
    if(
    $str[$b] == $str[$b+1]) {
    continue;
    } else {
    if(!isset(
    $str[$b+1])) {
    echo
    $str[$b]."^".$c[$b];
    } else {
    echo
    $str[$b]."^".$c[$b]." x ";
    }
    }
    }
    echo
    "</code>\n";
    }
    ?>

  6. #6
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    ehm... array_count_values() vi interessa?

  7. #7
    L'avatar di foreach
    foreach non è connesso Altervistiano Junior
    Data registrazione
    11-06-2008
    Residenza
    3 metri sotto terra
    Messaggi
    501

    Predefinito

    Salve,

    scusate se m'intrometto. Vorrei anche io fare una cosa del genere, ho letto il codice di gabryhacker al post #5 e ho elaborato io un codice:

    Codice PHP:
    <?php

    function scomponi($num, $pot = false) {
    $d = 2;
    $ar = array();

    switch(
    $pot) {
    case
    true:
    // qui fare con il metodo che chiedo
    break;
    case
    false:
    while(
    $num > 1) {
    if(
    $num%$d == 0) {
    $ar[] = $d;
    $num /= $d;
    } else {
    $d++;
    continue;
    }
    }
    break;
    default: return(
    false); break;
    }
    return(
    $ar);
    }



    $nums = (empty($_GET['num']) ? 2520 : $_GET['num']);

    echo
    join(" x ", scomponi($nums));


    ?>
    In questo caso chiamando scomponi(1048576) mi dà 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2 x 2, ma io, nel caso chiamo scomponi(1048576, true), che mi dà 2(20) cioè 2 alla 20esima.
    Voglio che succeda questo nel caso il secondo parametro sia true, come vedete nel ciclo switch()


    Mi potete aiutare che io non è cosa che lo faccio?


    Grazie,
    foreach
    Ultima modifica di foreach : 29-10-2008 alle ore 00.07.24
    Codice PHP:
    foreach($vettore as $chiave => $valore) {
    echo 
    "Ciao";


  8. #8
    Guest

    Predefinito

    Citazione Originalmente inviato da dreadnaut Visualizza messaggio
    ehm... array_count_values() vi interessa?
    Non capisco come possa usarlo nel mio script

  9. #9
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    dato un'array con tutti i fattori ( e.g. 2,2,2,3,3,5 ) ti restituisce il conteggio degli stessi ( 2 => 3, 3 => 2, 5 => 1 ), che non è poi difficile stampare in modo leggibile

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •