2017-09-27 10 views
-1

J'essaie d'apprendre à écrire des fonctions récursives en C et j'ai écrit cette fonction qui compte le nombre de zéros dans un nombre positif spécifié, comme une pratique . Mais, il ne peut gérer qu'une entrée d'une longueur maximale de 10. L'entrée avec 11 numéros ou plus échoue et je ne vois pas pourquoi.Fonction récursive en C - ne peut pas gérer une grosse entrée [nombre zéros]

Ex.

input = 1204067809 (correct) 
output = 3 

input = 12040678091 (fails!!) 
output = 0 

input = 120406780914234(fails!!) 
output = 1 

code:

#include <stdio.h> 
int rCountZeros1(int num); 

int main() 
{ 
    int number; 
    printf("Enter the number: \n"); 
    scanf("%d", &number); 
    printf("rCountZeros(): %d\n", rCountZeros(number)); 
    return 0; 
} 

int rCountZeros(int num) 
{ 
    if (num==0) 
    return 1; 
    else if (num<10) 
    return 0; 

    if (num % 10 == 0) 
    return 1+rCountZeros(num/10); 
    else 
    return rCountZeros(num/10); 
} 
+2

vos valeurs ne tiennent pas dans un nombre entier. essayez 'long long' –

+0

Votre programme peut également échouer avec un numéro à 10 chiffres, par exemple' 2147483647 + 1' –

Répondre

1

12040678091 est>2**31, vos entiers sont probablement 32 bits, et scanf ne gère pas le débordement correctement. Donc ça ne marche pas avec int.

Les exemples que vous avez utilisés entreraient dans un unsigned long long ou uint64_t. Cependant, je suggère l'approche de la chaîne: ne pas convertir en entiers, juste faire un char par analyse de char pour compter les zéros, et vous serez capable de gérer toute taille entière (bien, si votre tampon de chaînes est assez grand, est)

(en comptant les caractères dans une chaîne avec une fonction récursive est maintenant officiellement surpuissant, mais peut être fait à des fins de recherche, en propageant l'indice de la chaîne, et non la valeur divisée)

1

Chaque type de valeur dans toutes les langues de programmation a une limite. Dans votre cas, une variable entière de 32 bits peut gérer une valeur maximale de 2 147 483 647. Rien de plus que cela entraînera une erreur.

0

Je suppose que votre compilateur déclare, int comme variable de 4 octets. Votre numéro doit se situer entre la plage:

signed : -2,147,483,648 to 2,147,483,647 
unsigned: 0 to 4,294,967,295 

Si vous souhaitez effectuer l'opération essayez d'utiliser un nombre entier long long.