I'd like to count number 1
in my input, for example,111
(1 1 1) must return 3
and
101
must return 2
(1 1)
To achieve this,I developed sample code as follows.
#include <iostream>
using namespace std;
int main(){
string S;
cout<<"input number";
cin>>S;
cout<<"S[0]:"<<S[0]<<endl;
cout<<"S[1]:"<<S[1]<<endl;
cout<<"S[2]:"<<S[2]<<endl;
int T = (int) (S[0] S[1] S[2]);
cout<<"T:"<<T<<endl;
return 0;
}
But when I execute this code I input 111
for example and my expected return is 3
but it returned 147
.
[ec2-user@ip-10-0-1-187 atcoder]$ ./a.out
input number
111
S[0]:1
S[1]:1
S[2]:1
T:147
What is the wrong point of that ? I am totally novice, so that if someone has opinion,please let me know. Thanks
CodePudding user response:
It's because S[0]
is a char
. You are adding the character values of these digits, rather than the numerical value. In ASCII, numerical digits start at value 48. In other words, each of your 3 values are exactly 48 too big.
So instead of doing 1 1 1
, you're doing 49 49 49
.
The simplest way to convert from character value to digit is to subtract 48, which is the value of 0
.
e.g, S[0] - '0'
.
CodePudding user response:
Since your goal is to count the occurrences of a character, it makes no sense to sum the characters together. I recommend this:
std::cout << std::ranges::count(S, '1');
To explain the output that you get, characters are integers whose values represent various symbols (and non-printable control characters). The value that represents the symbol '1'
is not 1. '1' '1' '1'
is not '3'
.