|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
[C] Divisibilità per 11
Ciao
Sono di fronte a questo problema: Scrivere un programma C ricorsivo che dica se un numero n è divisibile per 11. Io ho provato a farlo così: Codice:
#include <stdio.h>
#include <math.h>
int div_per11(int);
int sp(int);
int sd(int);
int main(void){
int num;
printf("Inserisci numero: ");
scanf("%d", &num);
if(div_per11(num))
printf("Il numero è divisibile per 11");
else
printf("Il numero non è divisibile per 11");
return 0;
}
int sp(int n){
if (n>0)
return (n%10)+sp(n/100);
else return 0;
}
int sd(int n){
n/=10;
if (n>0)
return (n%10)+sd(n/100);
else return 0;
}
int div_per11(int n){
if(n%11)
return 1;
else return (div_per11(abs(sp(n)-sd(n))));
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Codice:
if((numero % 11) == 0) //divisibile else //non divisibile a che serve la ricorsione?
Ultima modifica di kk3z : 07-11-2005 alle 16:59. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
non so assolutamente niente di C. cmq a livello di algoritmo non capisco a cosa serva tutto quel papiro di codice...
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
L'algoritmo per vedere se un numero è divisibile per 11 o no è il seguente:
Dato un numero n si dice sp(n) e sd(n) rispettivamente la somma delle cifre pari e delle cifre dispari in n. Se la differenza in valore assoluto tra sp(n) e sd(n) è divisibile per 11 allora vuol dire che n è divisibile per 11. Ecco devo implementare questo algoritmo in C. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Beh, o usi l'algoritmo o usi l'operatore %, altrimenti non ha senso l'algoritmo usato per vedere se il numero è divisibile per 11, quando già sai che non lo è facendo "numero%11",
EDIT: ma poi scusa, prendiamo 121 (11 *11), pari: 2 dispari:1+1=2 viene 0 / 11 Ultima modifica di kk3z : 07-11-2005 alle 17:50. |
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Quote:
http://www.math.it/formulario/divisibilita.htm 0 è divisibile per qualsiasi numero tranne che per se stesso. Quote:
Poi non capisco perché il compilatore mi dice che abs non è dichiarata da nessuna parte Ultima modifica di Manugal : 07-11-2005 alle 18:32. |
||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bordeaux - France
Messaggi: 364
|
Certo che questo codice non ha alcuna utilità pratica... è decine di volte peggiore del semplice n%11==0 ...
Ma tant'è: te l'han chiesto ricorsivo, perciò volevano propio questo...
__________________
- fuocofatuo - |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Mi hanno chiesto di implementare questo algoritmo perché mi hanno dato degli esercizi sulla ricorsione, deve essere utile solamente per farmi capire bene la ricorsione tutto qui
|
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
comunque ci riporti esattamente gli errori del compilatore con anche i numeri di linea? |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
L'errore è esattamente in questa linea:
else return (div_per11(abs(sp(n)-sd(n)))); e mi dice che abs non è dichiarata in alcun punto. |
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Grazie con stdlib.h me lo compila.... però non sono sicuro che funzioni correttamente. Troppe volte mettendo numeri a caso mi dice che il numero è divisibile per 11.
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
EDIT...
il codice ha ben poco senso... la funzione div_per11 così com'è non va bene, devi usare l'algoritmo che hai citato e poi usi il MOD?
Ultima modifica di sirus : 07-11-2005 alle 20:34. |
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Jul 2003
Messaggi: 207
|
In teoria per numeri di mooooolte cifre dovrebbe essere più veloce la funzione ricorsiva che %11.
Comunque non dovresti utilizzare %11, ma ricorrere finchè trovi un numero <11: se è diverso da zero il numero non è divisibile per 11. (PS non so se questo è il posto più adatto per i compiti per casa...
__________________
------------------------------------- Fletto i muscoli e sono nel vuoto ------------------------------------ |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Cioè quindi dovrei cambiare proprio il caso base? E dirgli che se un numero è minore di 11 controllo che sia anche uguale a 0 per dire che è divisibile?
|
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Jul 2003
Messaggi: 207
|
Ho letto bene il tuo programma e non mi sembra che sia ricorsivo, ed è pure sbagliato.
Il codice: Codice:
if(n%11)
return 1;
Codice:
if(div_per11(num))
printf("Il numero è divisibile per 11");
Credo (dovrei controllare) che dovrebbe essere dare i risultati corretti se fosse (nel main): Codice:
if(div_per11(num))
printf("Il numero non è divisibile per 11");
else
printf("Il numero è divisibile per 11");
return 0;
La funzione div_per11 dovrebbe se il numero è minore di 11, riportare il risultato (0 o 1) se è maggiore di 11, chiamare div_per11 con la differenza delle somme delle cifre di posto pari e dispari. Non voglio essere più preciso perché altrimenti non imparesti nulla.
__________________
------------------------------------- Fletto i muscoli e sono nel vuoto ------------------------------------ |
|
|
|
|
|
#17 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
mega OT: r., la citazione che hai in firma è stupenda, ti stimo troppo!!
![]() ps: riconosci la mia? |
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Jul 2003
Messaggi: 207
|
@71104: non non me la ricordavo, ma G.E.M.A. (google e' mio amico)
-> yattaman?
__________________
------------------------------------- Fletto i muscoli e sono nel vuoto ------------------------------------ |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bordeaux - France
Messaggi: 364
|
Quote:
Il criterio di divisibilità citato è molto comodo per il calcolo manuale, perchè adoperando i numeri in base dieci è facile far la somma di cifre pari e dispari. Ma per un computer, che opera in base due, dividere per 10 è difficile quanto dividere per 11.
__________________
- fuocofatuo - |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:48.











a che serve la ricorsione?









