문제 URL:
11720번: 숫자의 합
첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.
www.acmicpc.net
다음 문제는 공백 없이 쓰여진 N개의 숫자를 모두 합해서 출력하는 프로그램을 작성하는 문제로
첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어지고, 둘째 줄에 숫자 N개가 공백없이 주어진다.
처음에 풀 때는 숫자 N개를 string 문자열로 입력받은 뒤,
이것을 stoi() 함수를 이용하여 숫자로 바꿔주는 방식을 사용하려했다.
하지만 계속 런타임 에러(out_of_range)가 일어났는데,
인터넷 검색을 통해서 알고 보니 int 형의 max값이 2147483647이라는 점을 생각하지 못했었다.
문제에서 숫자 N개는 int의 max값을 넘을정도로 많이 입력될 수 있으므로 위와 같은 방법을 통해 풀면 string에서 int형으로 변환할 때 max값을 넘는 나머지 값들은 입력이 되지 못하는 것이었다.
더보기
처음에 풀었던 방식
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n, x, sum=0;
cin >> n;
string s;
cin >> s;
int i = stoi(s); //max값 이상이라면 int형 변수에 저장되지 못함
while(i!=0)
{
x = i%10;
i = i/10;
sum += x;
}
cout << sum;
}
따라서 다시 풀 때는 아스키 코드를 이용하여 문제를 풀었다.
sum 변수에 string의 각 요소를 더할 때, 문제에서 입력받는 N값은 모두 숫자 형태인 문자열이므로
각 요소를 int형에 대입하면 아스키코드 넘버로 입력이 된다.
때문에 각각의 값에 아스키 코드에서 0에 해당하는 48을 빼주어 입력받은 값과 같은 형태의 숫자를 만들어주었다.
위 과정을 거친 코드는 아래와 같다.
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n, sum=0;
cin >> n;
string s;
cin >> s;
for(int i=0; i<n; i++)
{
sum += s[i]-48;
}
cout << sum;
return 0;
}