where the wrong here? my codeblocks gives right output but in hackerrank it wrong answer.
#include <string.h>`
#include <math.h>
#include <stdlib.h>
int main() {
char s[1000];
char a[10]={0,0,0,0,0,0,0,0,0,0};
int i;
scanf("%[^\n]", s);
int l = strlen(s);
for(i=0; i<l; i ){
int m = s[i]-48;
a[m]=a[m] 1;
}
for(i=0; i<9; i ){
printf("%d ", a[i]);
}
printf("%d", a[9]);
return 0;
}```
CodePudding user response:
If you put the condition m>=0 and m<10 then a[m] . The code will work fine. Working code. Also updated size to 1001.
#include <string.h>`
#include <math.h>
#include <stdlib.h>
int main() {
char s[1001] ;
char a[10]={0,0,0,0,0,0,0,0,0,0};
int i;
scanf("%[^\n]", s);
int l = strlen(s);
for(i=0; i<l; i ){
int m = s[i]-48;
if(m>=0 && m<10)
a[m] ;
}
for(i=0; i<=9; i ){
printf("%d ", a[i]);
}
return 0;
}
CodePudding user response:
For starters these headers
#include <string.h>`
#include <math.h>
#include <stdlib.h>
are redundant. The program can be written without using any declaration from the headers.
Instead you need to include the header <stdio.h>
#include <stdio.h>
The array a
should have the type size_t
. Even for the character array having 1000
elements an object of the type char
can be unable to store such big values.
And the initialization of the array a
can be simpler
size_t a[10] = { 0 };
Also as it follows from the assignment the character array s
should be able to store a string with the length equal to 1000
. It means that the character array itself shall have at least 1001
character to be able to store also the terminating zero character '\0'
of a string with 1000
characters.
These statements
int m = s[i]-48;
a[m]=a[m] 1;
can result in accessing memory beyond the array a
that invokes undefined behavior because there is no check whether the current character contains a digit.
The program can look the following way.
#include <stdio.h>
int main( void )
{
char s[1001];
size_t digits[10] = { 0 };
if ( scanf( "00[^\n]", s ) == 1 )
{
for ( size_t i = 0; s[i] != '\0'; i )
{
if ( '0' <= s[i] && s[i] <= '9' )
{
digits[s[i] - '0'];
}
}
for ( size_t i = 0; i < 10; i )
{
printf( "%c: %zu\n", ( char )( i '0' ), digits[i] );
}
}
return 0;
}
For example if to enter string "122333444455555666666777777788888888999999999"
then the output will look like
0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
If you need to output frequencies in one line then instead of this statement
printf( "%c: %zu\n", ( char )( i '0' ), digits[i] );
just write
printf( "%zu ", digits[i] );
In this case for the above string the output will be
0 1 2 3 4 5 6 7 8 9