아스키코드값을 이용해서 푸는 문제다.
아스키코드표를 보면 숫자 0부터 9까지가 48부터 57까지인것을 알 수 있다.
예를들어 문자로 숫자 5를 입력받으면 53가 되므로 48('0')을 빼주면 원하는 값을 받을수 있다.
#include <iostream>
using namespace std;
int main() {
int n, sum = 0;
char c;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> c;
sum += c - 48;
}
cout << sum << endl;
}
문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만
듭니다. 만들어진 자연수와 그 자연수의 약수 개수를 출력합니다.
만약 “t0e0a1c2her”에서 숫자만 추출하면 0, 0, 1, 2이고 이것을 자연수를 만들면 12가 됩니
다. 즉 첫 자리 0은 자연수화 할 때 무시합니다. 출력은 12를 출력하고, 다음 줄에 12의 약
수의 개수를 출력하면 됩니다.
추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.
▣ 입력설명
첫 줄에 숫자가 썩인 문자열이 주어집니다. 문자열의 길이는 50을 넘지 않습니다.
▣ 출력설명
첫 줄에 자연수를 출력하고, 두 번째 줄에 약수의 개수를 출력합니다.
▣ 입력예제 1
g0en2Ts8eSoft
▣ 출력예제 1
28
6
문자열 사이에서 숫자만 찾은다음에 숫자를 합쳐서 출력하고 합친 숫자의 약수의 개수를 출력할 수 있다.
아스키코드 값이 48에서 57 사이라면 숫자임을 알 수 있다.
위 과정을 통해 문자열안에 0 0 1 2라는 숫자가 있음을 알 수 있으며 이를 12로 만들기 위해서는
총합에 곱하기 10을 하면서 각 값을 더해주는 과정을 반복하면 된다.
sum = sum * 10 + (c[i] - 48);
0 0 1 2 ->
0 * 10 + 0 = 0
0 * 10 + 0 = 0
0 * 10 + 1 = 1
1 * 10 + 2 = 12
#include <iostream>
using namespace std;
int main()
{
char c[50];
int sum = 0;
int cnt = 0;
cin >> c;
for (int i = 0; c[i] != '\0'; i++) // 문자열이기때문에 널문자 전까지 반복문실행
{
// 0 1 2 3 4 5 6 7 8 9
// 48 49 50 51 52 53 54 55 56 57
if (c[i] >= 48 && c[i] <= 57)
{
// 0 0 1 2 ->
// 0*10 + 0 = 0
// 0*10 + 0 = 0
// 0*10 + 1 = 1
// 1*10 + 2 = 12
sum = sum * 10 + (c[i] - 48);
}
}
for (int j = 1; j <= sum; j++)
{
if (sum % j == 0)
cnt++;
}
cout << sum << endl;
cout << cnt << endl;
}