Funzione in C Individuare se il numero sia primo sia numero di Armstrong

di Anonimizzato29959 il
52 risposte

52 Risposte - Pagina 2

  • Ho provato in questo modo... Anche se nel main non mi da se e' un numero di Armstrong si ferma alla printf("Verificare se il valore intero sia un numero di Armstrong)"
  • A parte il fatto che non si capisce perché restituisci sum (che c'entra? Devi restituire 0 o 1 per capire se è un numero valido o no) e hai eliminato il confronto di sum con il numero iniziale, il valore di k iniziale non è 0 e devi utilizzare un vettore. Più semplicemente, cambiando di poco il codice precedente, puoi utilizzare il logaritmo in base 10 per ottenere le cifre prima di fare la somma, ovvero
    
    int check_Armstrong(int num) {
    	int copia_num = num, sum = 0, rem;
    	int cifre = 1+(int)(log(num)/log(10));
    
    	while (num)
    	{
    		rem = num % 10;
    		sum += (int)pow(rem, cifre);
    		num /= 10;
    	}
    
    	if (sum == copia_num)
    		return 1;
    	else
    		return 0;
    }
    
  • #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define SIZE 50
    
    /*Definizione dei prototipi*/
    int check_primo(int numP);
    int check_Armstrong (int numA);
    
    int main(){
        int N;
        
        printf("Inserire un valore intero: ");
        scanf("%d",&N);
        
        printf("Verificare se il valore intero sia un numero primo\n");
        int cont= check_primo(N);
        if(cont==1){
            printf("Il numero e' primo\n");
        } else printf("Il numero non e' primo\n");   
        
        printf("Verificare se il valore intero sia un numero di Armstrong\n");
        int num=check_Armstrong(N);
        if(num==N){
            printf("%d e' un numero di Armstrong\n",N);
        } else printf("%d non e' un numero di Armstrong\n",N);
        
        return 0;
    }
    
    int check_primo(int numP){
        int div=1,cont=0;
        
        while((div<numP) && !cont){
            if((numP%div)==0){
                cont++;
            } else
            div++;
        }
        
        return cont;
    }
    
    int check_Armstrong(int numA){
        int copia_num=numA,sum=0,rem;
        int cifre=1+(int)(log(numA)/log(10));
        
        while(numA){
            rem=numA%10;
            sum+=(int)pow(rem,cifre);
            numA /=10;
        }
        if(sum==copia_num)
            return 1;
        else 
            return 0;
    }
  • Pur con i tuoi sacri consigli, davvero non riesco a comprendere perchè non risulta che 153 sia un numero di Armstrong
  • Ma hai capito che la funzione restituisce 1 se è un numero valido o 0 se non lo è?
    Perché nel main confronti quello che ti restituisce la funzione nuovamente con il numero??

    Nel main devi solo controllare se è 1 o 0, come fai con l'altra funzione
    
    	printf("Verificare se il valore intero sia un numero di Armstrong\n");
    	int ris = check_Armstrong(N);
    	if (ris == 1)
    		printf("%d e' un numero di Armstrong\n", N);
    	else 
    		printf("%d non e' un numero di Armstrong\n", N);
    
  • Avevo provato anche a farlo in questa maniera prima di postarlo ma si presentava lo stesso problema
  • Ecco cosa mi stampa
    Allegati:
    29959_807afc9731e22ef9a242f26a079d9d64.jpg
    29959_807afc9731e22ef9a242f26a079d9d64.jpg
  • Non si vede il codice che hai usato dallo screenshot. Probabilmente c'era un errore rispetto a quello che ti ho proposto, non credi?
  • #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    /*Definizione dei prototipi*/
    int check_primo(int numP);
    int check_Armstrong (int numA);
    
    int main(){
        int N;
        
        printf("Inserire un valore intero: ");
        scanf("%d",&N);
        
        printf("Verificare se il valore intero sia un numero primo\n");
        int cont= check_primo(N);
        if(cont==1){
            printf("Il numero e' primo\n");
        } else printf("Il numero non e' primo\n");   
        
        printf("Verificare se il valore intero sia un numero di Armstrong\n");
        int ris=check_Armstrong(N);
        if(ris==1){
            printf("%d e' un numero di Armstrong\n",N);
        } else printf("%d non e' un numero di Armstrong\n",N);
        
        return 0;
    }
    
    int check_primo(int numP){
        int div=1,cont=0;
        
        while((div<numP) && !cont){
            if((numP%div)==0){
                cont++;
            } else
            div++;
        }
        
        return cont;
    }
    
    int check_Armstrong(int numA){
        int copia_num=numA,sum=0,rem;
        int cifre=1+(int)(log(numA)/log(10));
        
        while(numA){
            rem=numA%10;
            sum+=(int)pow(rem,cifre);
            numA/=10;
        }
        if(sum==copia_num)
            return 1;
        else 
            return 0;
    }
  • oregon ha scritto:


    Non si vede il codice che hai usato dallo screenshot. Probabilmente c'era un errore rispetto a quello che ti ho proposto, non credi?
    Assolutamente sono un totale fallimento con le funzioni XD
  • Quindi risolto, funziona?
  • Persiste sempre lo stesso problema :/
  • No, ho provato e funziona.
  • Allora sarà certamente un problema legato al compilatore...
  • Ti ringrazio infinitamente per l'aiuto
Devi accedere o registrarti per scrivere nel forum
52 risposte