Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [C] Funzione di Eulero

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    10

    [C] Funzione di eulero

    Salve a tutti sono nuovo del forum, vorrei porvi subito una domanda riguardo alcune righe di codice (dal quale si capirà subito che sono nuovo del C).

    Il programma che ho scritto dovrebbe calcolare la funzione di Eulero che ho da poco studiato all'università.
    Io l'ho suddiviso in un sottoproblema in cui mi crea una lista con la scomposizione in fattori primi la quale funziona bene e li ordina in modo crescente (ma con l'1 in fondo).
    Il problema sta nella funzione "resto" chiamata dalla funzione "eulero" che sembra restituirmi sempre il valore 1. Da un paio di giorni cerco di capire se è un problema di cast o qualcosa di simile. Grazie dell'aiuto in anticipo.

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <stdlib.h>
    
    
    struct nodo;
    typedef struct nodo {
      int key;
      struct nodo *next;
    }NODO;
    
    void alloca_in_coda (int n, NODO* *ptr);
    int eulero (int n, NODO* *ptr);
    float resto (NODO* *ptr);
    
    int eulero (int n, NODO* *ptr) {
    float r;
    if (((*ptr)->key)==n) {return (n-1);}
    else {
    r=(resto(ptr));
    n=(((float)n)*r);
    return (n);
    }
    }
    
    float resto (NODO* *ptr) {
    float k=1;
    int i=0;
    while (((*ptr)->key)!=1) {
    if (i!=((*ptr)->key)){
      k=k*(1-(1/((*ptr)->key)));
      i=(*ptr)->key;
    }
    ptr=&((*ptr)->next);
    }
    printf ("%f", k);
    return (k);
    }
    
    
    void scomposizione (NODO* *ptr, int n) {
    int i;
    if (n==1) { alloca_in_coda (n, ptr); };
    for (i=2; i<=n; i++) {
      if ((n%i)==0) { 
    		alloca_in_coda (i, ptr);
    		scomposizione (ptr, (n/i));
    		break;
    		}
    }
    }
    
    
    void alloca_in_coda (int n, NODO* *ptr) {
    while ((*ptr)!=NULL) {
      ptr=(&((*ptr)->next));
      }
    (*ptr)=(NODO*)malloc(sizeof(NODO));
    (*ptr)->key=n;
    (*ptr)->next=NULL;
    }
    
    void stampa (NODO* *ptr) {
    while (*ptr) {
      printf("%d ", (*ptr)->key);
      ptr=&((*ptr)->next);
    }
    printf("\n");
    }
    
    int main () {
    NODO *root=NULL;
    int n;
    char buffer [4];
    int fi;
    printf ("\nInserisci numero che vuoi scomporre in fattori primi ");
    scanf ("%d", &n);
    scomposizione (&root, n);
    stampa (&root);
    printf ("\nVuoi calcolare la funzione di Eulero su %d? ", n);
    scanf ("%s", buffer);
    if (!(strcmp(buffer, "si"))) {
    fi=eulero(n, &root);
    printf ("\nFi(%d) = %d\n", n, fi);
    }
    else {return (0);};
    return (1);
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    Vedere il Regolamento interno per le modalità di posting del codice e altri dettagli sulla partecipazione alle discussioni.


    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.