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

di Anonimizzato29959 il
52 risposte
Salve a tutti... Qualcuno potrebbe aiutarmi a capire come comportarsi con le funzioni e darmi qualche consiglio per questo esercizio? Grazie mille

/*Scrivere un programma che riceve un valore intero in input da tastiera e
verifichi se il numero è primo e se è un numero di Armstrong.
- Utilizzare due funzioni
– check_Primo e check_Armstrong
- Numero di Armstrong= numeri per i quali la somma delle k cifre che li
costituiscono, ognuna elevata a k, equivale al numero di partenza*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/*Definizione dei prototipi*/
int check_primo(int n);
int check_Armstrong(int num);

int main(){
    int N;
    
    printf("Inserire un valore intero: ");
    scanf("%d",&N);
   
    printf("Verificare se il valore intero sia un numero primo\n");
    if(check_primo(N)==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");
    if(check_Armstrong(N)==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 n){
    int div=1,cont=0;
    
    while(cont<=1 && div<n/2){
        if(n%div==0){
            cont++;
        }
        div++;
    }
    if(cont==1){
        return 1;
    }
    
    return 0;
}

int check_Armstrong(int num){
    int copia_num,sum=0,rem;
    
    copia_num=num;
    
    while(num!=0){
        rem=num%10;
        sum=sum+(pow(rem,3));
        num=num/10;
        
        if(sum == num){
            return 1;
    } 
        return 0;
}
}

52 Risposte

  • Hai un esercizio e un codice. Qual è la domanda? Fra l'altro il titolo del thread è troppo generico ...
  • Ho cercato di risolvere l'esercizio ma non capisco dove sbaglio.. forse nell'impostare le funzioni
  • Nella funzione "check_primo" passi la variabile "primo", che però dopo non adoperi: usi invece la variabile N che non è inizializzata. Lo stesso fai nella funzione "check_Armstrong".
  • Ho aggiornato il codice... però lo stesso non funziona... Forse dovrei aggiungere return 1 e return 0?
  • Nelle funzioni non devi usare il printf per dare risultati a video. Le funzioni devono solo restituire vero o falso.
  • Ho seguito il tuo prezioso consiglio però lo stesso non funziona... :/ Non capisco l'errore
  • Magari mostra il codice modificato dopo che hai seguito i consigli (ma NON modificare il post iniziale o non si capisce più nulla)
  • #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    /*Definizione dei prototipi*/
    int check_primo(int n);
    int check_Armstrong(int num);
    
    int main(){
        int N;
        
        printf("Inserire un valore intero: ");
        scanf("%d",&N);
       
        printf("Verificare se il valore intero sia un numero primo\n");
        if(check_primo(N)==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");
        if(check_Armstrong(N)==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 n){
        int div=1,cont=0;
        
        while(cont<=1 && div<n/2){
            if(n%div==0){
                cont++;
            }
            div++;
        }
        if(cont==1){
            return 1;
        }
        
        return 0;
    }
    
    int check_Armstrong(int num){
        int copia_num,sum=0,rem;
        
        copia_num=num;
        
        while(num!=0){
            rem=num%10;
            sum=sum+(pow(rem,3));
            num=num/10;
            
            if(sum == num){
                return 1;
        } 
            return 0;
    }
    }
    
  • Sempre lo stesso errore... Il numero non e' ne' primo ne' di Armstrong
  • Con quale numero stai provando? Comunque la funzione è sbagliata in quanto il test lo devi fare fuori dal ciclo, ovvero dopo che hai completato la somma. E poi il confronto va fatto con la copia del numero dato che num è diventato zero
    
    int check_Armstrong(int num) {
    	int copia_num, sum = 0, rem;
    
    	copia_num = num;
    
    	while (num)
    	{
    		rem = num % 10;
    		sum += (int)pow(rem, 3);
    		num /= 10;
    	}
    	
    	if (sum == copia_num)
    		return 1;
    	else
    		return 0;
    }
    
    Ma ATTENZIONE ... dai per scontato che il numero sia sempre a 3 cifre dato che elevi sempre a 3 con la pow, ma il numero non è detto che sia sempre a 3 cifre
  • "dai per scontato che il numero sia sempre a 3 cifre dato che elevi sempre a 3 con la pow, ma il numero non è detto che sia sempre a 3 cifre"
    E come dovrei fare?
  • #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    /*Definizione dei prototipi*/
    int check_primo(int n);
    int check_Armstrong(int num);
    
    int main(){
        int N;
        
        printf("Inserire un valore intero: ");
        scanf("%d",&N);
       
        printf("Verificare se il valore intero sia un numero primo\n");
        if(check_primo(N)==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");
    
        if(check_Armstrong(N)==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 n){
        int div=1,cont=0;
        
        while(cont<=1 && div<n/2){
            if(n%div==0){
                cont++;
            }
            div++;
        }
        if(cont==1){
            return 1;
        }
        
        return 0;
    }
    
    int check_Armstrong(int num){
        int copia_num,sum=0,rem;
        
        copia_num=num;
        
        while(copia_num!=0){
            rem=copia_num%10;
            sum=sum+(pow(rem,3));
            copia_num=copia_num/10;
            
    }
        return copia_num;
    }
    
  • Andiamo ... ragiona un po'. Se facessi il test di 8208 cosa dovresti fare? Ovviamente prima devi calcolare quante cifre ha il numero (in questo caso 4) e usare tale valore nella pow. Naturalmente il "numero di cifre" da usare nella pow deve essere contenuto in una variabile.

    Come si calcola il numero di cifre di un numero?
  • #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 sum2 = check_Armstrong(N);
        if(N==sum2){
            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,sum=0,rem,i,V[SIZE],k;
        
        copia_num=numA;
        
        for(i=0;copia_num!=0;i++){
            V[i]=copia_num%10;
            copia_num=copia_num%10;
            k++;
        }
        
        for(i=0;i<k;i++){
            sum=sum+pow(V[i],k);
        }
        
        return sum;
    }
Devi accedere o registrarti per scrivere nel forum
52 risposte