|
|
|
![]() |
|
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 ![]() Ultima modifica di kk3z : 07-11-2005 alle 15: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 16: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 17: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 19:34. |
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Jul 2003
Messaggi: 209
|
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: 209
|
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: 209
|
@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:36.