Rupesh
Rupesh

Reputation: 81

Digit Frequency Program (HackerRank)

I'm trying to compare each character of the given string with numbers 0 to 9, and on successful comparison, increment the count variable. Finally, printing the value of count variable for each of the numbers. But these method isn't working out. Can't figure out why.

int main() {

    char *s;
    s = malloc(1024 * sizeof(char));
    scanf("%[^\n]", s);

    int i,j,count=0;
    for(i=0;i<=9;i++)
    {   
        for(j=0;j<strlen(s);j++)
        {
            if(s[j]==i)
            {
                count++;
            }
        }
    printf("%d ",count);
    }   
    return 0;
}

Upvotes: 0

Views: 1461

Answers (3)

Vlad from Moscow
Vlad from Moscow

Reputation: 311048

Finally, printing the value of count variable for each of the numbers.

So you need an array to store counters for each digit. It is strange that zero is excluded from counted digits.

In this if statement

if(s[j]==i)

you have to write at least

if( s[j] - '0' == i )

And moreover this loop

for(i=0;i<=9;i++)

also tries to count zeroes though you wrote that to count only digits 1-9 inclusively.

Your approach is inefficient because you are traversing the same character array several times. And there is no sense to allocate a character array dynamically.

The program can look the following way

#include <stdio.h>

int main(void) 
{
    enum { M = 9, N = 1024 };
    char s[N];
    s[0] = '\0';

    size_t counter[M] = { 0 };

    fgets( s, N, stdin );

    for ( const char *p = s; *p; ++p )
    {
        if ( '0' < *p && *p <= '9' )
        {
            ++counter[*p - '0' - 1];
        }
    }

    for ( size_t i = 0; i < M; i++ )
    {
        printf( "%zu ", counter[i] );
    }
    putchar( '\n' );

    return 0;
}

If to enter for example a string like

12345678987654321246897531

then the output will be

3 3 3 3 3 3 3 3 2 

In fact the character array is redundant for this task. Moreover it restricts the length of the entered sequence of digits. You could write the program without using a character array. For example

#include <stdio.h>

int main(void) 
{
    enum { M = 9, N = 1024 };
    size_t counter[M] = { 0 };

    for ( int c; ( c = getchar() ) != EOF && c != '\n'; )
    {
        if ( '0' < c && c <= '9' )
        {
            ++counter[c - '0' - 1];
        }
    }

    for ( size_t i = 0; i < M; i++ )
    {
        printf( "%zu ", counter[i] );
    }
    putchar( '\n' );

    return 0;
}

Upvotes: 1

123p10
123p10

Reputation: 166

In C a character value is a number, but it is not the number you are expecting here. When we have the character '2' and we check what it is equal to as a number we are really asking what the ASCII code of '2' is which in this case would be 50. You need to adjust your code so it converts the ASCII code into a numeric representation so 50 becomes 2. It is quite simple simply change your code so it looks like this

if((s[j] - '0') == i){

This works because the ASCII code of 0 is 48, the ASCII code of 1 is 49, etc etc.

TL;DR In C a character value is not equal to it's numeric value. You need to convert '5' to 5. To do this you adjust your code so you subtract the '0' character from your numeric character.

Upvotes: 0

NewPythonUser
NewPythonUser

Reputation: 351

   if(s[j]==i) <<<<<<<<<
   {
        count++;
   }

You are comparing the ordinal value of the character to an integer in the range 0 to 9. Which is not what you want. You can convert a digit to int with this method:

char c = '5';
int x = c - '0';

So in your case it would be:

if(s[j] -'0' ==i)
{
    count++;
}

Upvotes: 0

Related Questions