문제출처: https://www.acmicpc.net/problem/1748
문제
1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.
1234567891011121314151617181920212223...
이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N(1≤N≤100,000,000)이 주어진다.
출력
첫째 줄에 새로운 수의 자릿수를 출력한다.
풀이
노트에 규칙성을 찾기위해 각 자릿수의 수들의합은 몇자리인지 적어봅니다
(1~9는 9, 10~99는 180,100~999는 2700입니다. 보기의 120의 답은 252입니다. 규칙성을 눈치채셨나요?
답은 n-1자리수까지의 숫자들을 나열한 수의 자릿수 + (n(끝값) - n자릿수의 시작 수- +1) * n입니다.
( 120-> 9(1~9) +180(10~99) + 63(100~120)=252 )
좀 복잡해보이지만 코드를 보면 이해가 갈거에요.
결론적으로, 위의 수식에서 색칠된 부분만 변수로 선언하여 답을 유도하면됩니다.
코드
#include<iostream> #include<string> using namespace std; int main() { string n; cin >> n; //120의 자릿수=3 int len = n.size(); //1~9자릿수 합=9 //10~99자릿수 합180 //100~120자릿수 합 63 //답: len-1자릿수까지의합+(n-n자리숫자의시작수+1)*n의 자릿수 if (len == 1) { cout << stoi(n); return 0; } //temp1=n자리숫자일때끝값(1자리:9,2자리:99,3자리:999) //temp2=n자리숫자일때첫값(1자리:1,2자리:10,3자리:100) int ans = 0, temp1 = 9, temp2 = 1; for (int i = 1; i < len; i++) { ans += temp1 * i; temp1 *= 10; temp2 *= 10; } cout << ans + (stoi(n) - temp2 + 1) * len << endl; }
결과
'문제풀이(BOJ) > 규칙찾기' 카테고리의 다른 글
[백준 11312] 삼각 무늬-2 (0) | 2019.12.15 |
---|---|
[백준 1834] 나머지와 몫이 같은 수 (0) | 2019.12.13 |
[백준 1964] 오각형,오각형,오각형... (0) | 2019.12.12 |
[백준 5691] 평균 중앙값 문제 (0) | 2019.12.04 |
[백준 10992] 별찍기-17 (0) | 2019.12.01 |