2016-12-04 1 views
1

Schreiben Sie eine C-Funktion Zählziffern (int num); wobei num eine positive ganze Zahl ist. Die Funktion zählt, wie oft jede der Ziffern 0..9 in num angezeigt wird, und druckt die Ergebnisse Eg (jeweils auf einer neuen Zeile.):Wie oft wird jede Ziffer angezeigt?

The digit 0 appeared 0 time(s) in 347213 
    The digit 1 appeared 1 time(s) in 347213 
..... 

Verwenden Iteration

int count_digits(int num){ 

int counter = 0; 
int nDigits = floor(log10(abs(num))) + 1; 

for(int i=0; i < nDigits; i++){ 
// How do I get each char of the integer? 


} 

} 

Das Hauptproblem, das ich habe, ist die Analyse jedes Char. Benutze ich getchar()?

+2

Seit 'getchar()' liest aus 'stdin' und Sie haben bereits die' num', für die Sie Ziffer zählt wünschen, werde ich voran gehen und sagen 'getchar()' ist hier sinnlos. Dies ist eine Übung in Divisions- und Modulo-Operationen, wobei ein Zählerfeld von zehn Elementen beibehalten wird. – WhozCraig

Antwort

2
void count_digits(int num) { 
    int i, arr[10] = {0}, e = num; 
    if(num == 0) arr[0]++; 
    while(num > 0) { 
     arr[num % 10]++; 
     num /= 10; 
    } 
    for(i = 0; i < 10; i++) { 
     printf("%d appears %d times in %d\n", i, arr[i], e); 
    } 
} 

Dies ist ein einfacher Code für diesen Zweck.

  1. Ich verwendete num > 0 als die Bedingung zum Anhalten der Schleife Ausführung.

  2. nahm ich den Rest des num, wenn sie von 10 num % 10 und inkrementiert den Zählwert in dem Array entsprechend dieser Rest (arr[num % 10]++) unterteilt.

  3. Ich teilte dann num von 10. Die Schleife wiederholt sich dann, bis die Bedingung nicht erfüllt ist.

  4. Dann habe ich nur die Werte gedruckt.

Edit: arr[10] = {0} initialisiert das Array arr der Größe 10 mit 0 s.

Bearbeiten 2: if(num == 0) arr[0]++. Diese Zeile überprüft, ob die Anzahl Eingang 0 ist und erhöht die Zählung in dem Array arr wenn es 0

+0

@WhozCraig, warte ich mache Änderungen! –

+0

@WhozCraig, du hast Recht. –

+1

Eine Optimierung: Sie können 'int arr [10] = {0};' machen und die erste 'for'-Schleife entfernen. – MayurK

0

Sie gleich

int sprintf(char * restrict str, const char * restrict format, ...); 

Mit dieser Funktion können Sie Ihre ganze Zahl in einen String setzen und nach Sie können mit der Tabelle Ascii jedes Zeichen tab[i] = '1' vergleichen ...

1

Es gibt eine Reihe von Möglichkeiten, um die Häufigkeit der einzelnen Ziffern in einer Zahl zu bestimmen. Viele Male ist es genauso einfach, die Nummer im Format im Gegensatz zu einer Zahl selbst zu handhaben. Der Ansatz zur Bestimmung der Häufigkeit ist in jedem Fall identisch, also passen Sie Ihre Routine an die Art der Daten an, die Sie behandeln.

Das kurze Beispiel unten führt eine einfache Schleife unter Verwendung von mod durch, um die Ziffern von jeder Zahl zu extrahieren, die an die ndigits()-Funktion übergeben wurde. Da Sie sich nur mit der Häufigkeit der Ziffern befassen, gibt es keine Neuordnung der getrennten Zahlen, wie sie in einem typischen Umwandlung Prozess erforderlich wäre. Sie übergeben Ihr Null-initialisiertes Frequenzarray als einen Parameter an die Funktion und innerhalb der Funktion aktualisieren Sie einfach das Element, das jeder Ziffer entspricht, die angetroffen wird.Bei der Rückkehr enthält das Array die pro stelligen Frequenz für jede Ziffer in der Zahl als ‚n‘ übergeben:

#include <stdio.h> 
#include <stdlib.h> /* for atoi */ 

#define NDIG 10 /* array size to hold frequency of digits (0-9) */ 

int ndigits (int n, int *a); 

int main (int argc, char **argv) { 

    int a[NDIG] = {0};  /* initialize freq array to all 0 */ 
    int n = argc > 1 ? atoi (argv[1]) : 347213, /* set number */ 
     nd = ndigits (n, a); /* get number of digits/set freq */ 

    printf (" the frequency of digits in '%d' (%d digits):\n\n", n, nd); 
    printf (" digits | frequency\n--------+---------\n"); 
    for (int i = 0; i < NDIG; i++) /* output elements of freq array */ 
     printf (" %6d | %2d\n", i, a[i]); 

    return 0; 
} 

/* record the frequency of digits in 'n' in array 'a' */ 
int ndigits (int n, int *a) 
{ 
    int d = 0; 
    for (; n; n /= 10, d++) 
     a[n % 10]++; 

    return d; 
} 

Beispiel Verwendung/Output

$ ./bin/freq_digits 
the frequency of digits in '347213' (6 digits): 

digits | frequency 
--------+--------- 
     0 | 0 
     1 | 1 
     2 | 1 
     3 | 2 
     4 | 1 
     5 | 0 
     6 | 0 
     7 | 1 
     8 | 0 
     9 | 0 

es über suchen und lassen Sie mich wissen wenn Sie weitere Fragen haben.

0

Mit % 10 können Sie auf einfache Art und Weise eine Dezimalziffer von int num eingeben.

log10(abs(num)) hat Probleme mit einigen nicht positiven Zahlen 0 und vielleicht INT_MIN. Es hat auch Probleme, sollte die Genauigkeit von int die Genauigkeit von double überschreiten. Dieses Genauigkeitsproblem ist nicht üblich, tritt jedoch bei ausgewählten 64-Bit-Computern auf. IAC, keine brauchen für double und eine gute Lösung existieren mit int math.

some_int % 10 ergibt einen Wert [-9 ... 9].

// A solution that handles the entire range of `int` including 0 and INT_MIN 
void count_digits(int num) { 
    int x = num; 
    int digit_count[10] = { 0 }; 

    // use a do loop to insure at least 1 pass - important for num == 0 
    do { 
    int digit = x % 10; 
    digit_count[abs(digit)]++; 
    x /= 10; 
    } while (x); 

    for (int i = 0; i < 10; i++) { 
    // Eliminated the "if" test to always display 10 lines. 
    if (digit_count[i]) { 
     printf("The digit %d appeared %d time(s) in %d\n", i, digit_count[i], 
      num); 
    } 
    } 
} 

Verwendungsbeispiel

#include <limits.h> 
int main(void) { 
    count_digits(347213); 
    count_digits(0); 
    count_digits(INT_MIN); 
    return 0; 
} 

The digit 1 appeared 1 time(s) in 347213 
The digit 2 appeared 1 time(s) in 347213 
The digit 3 appeared 2 time(s) in 347213 
The digit 4 appeared 1 time(s) in 347213 
The digit 7 appeared 1 time(s) in 347213 
The digit 0 appeared 1 time(s) in 0 
The digit 1 appeared 1 time(s) in -2147483648 
The digit 2 appeared 1 time(s) in -2147483648 
The digit 3 appeared 1 time(s) in -2147483648 
The digit 4 appeared 3 time(s) in -2147483648 
The digit 6 appeared 1 time(s) in -2147483648 
The digit 7 appeared 1 time(s) in -2147483648 
The digit 8 appeared 2 time(s) in -2147483648 
Verwandte Themen