고줭 2021. 5. 11. 23:47

문제

문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만듭니다.
만들어진 자연수와 그 자연수의 약수 개수를 출력합니다.
만약 “t0e0a1c2her”에서 숫자만 추출하면 0, 0, 1, 2이고 이것을 자연수를 만들면 12가 됩니다.
즉 첫 자리 0은 자연수화 할 때 무시합니다.

출력은 12를 출력하고, 다음 줄에 12의 약 수의 개수를 출력하면 됩니다.
추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.

입력설명

첫 줄에 숫자가 썩인 문자열이 주어집니다. 문자열의 길이는 50을 넘지 않습니다.

출력설명

첫 줄에 자연수를 출력하고, 두 번째 줄에 약수의 개수를 출력합니다.

 

입력예제

g0en2Ts8eSoft

출력예제

28
6


#include <stdio.h>
using namespace std;

int main(){
	freopen("input.txt", "rt", stdin);
	char a[51];
	int i, number=0, divisor=0;
	scanf("%s", &a);
	
	for(i=0; a[i]!='\0'; i++){
		if(a[i] >= 48 && a[i] <= 57){
			number = number * 10 + a[i] - 48;
		}
	}
	
	for(i=1; i<=number; i++){
		if(number%i == 0){
			divisor++;
		}
	}
	
	printf("%d\n%d", number, divisor);
	
	return 0;
}

첫 for문에 첨보는 문구가 있네요 배열의 끝은 널문자가 들어간다고합니다. 

vector<int> v;

for(auto iter=v.begin(); iter!=v.end(); iter++){
	cout << *iter << endl;
}

vector 사용시 쓰는 for문과도 많이 닮은거같네요.

다음 부분을 보시면 number = number * 10 + a[i] - 48; 을 썼는데 첨에 보고 이해를 못했습니다. 왜 저렇게 쓰는거지?
우리는 항상 뇌버깅을 먼저 해보는데 정 모르겠다면 브레이크포인트 잡고 디버깅을 하는것이 좋습니다.

입력예제를 볼까요 편의상 아스키코드 - 48 했다고 가정하고 쓰겠습니다.
a[i] = 0 일경우
number = 0*10 + 0
number = 0;

a[i] = 2 일경우
number = 0*10 + 2
number = 2;


a[i] = 8 일 경우
number = 2*10 + 8
number = 28;

위 for문이 끝나면 number= 28 이고 아래 for문이 끝나면 divisor = 6이 됩니다.