이전에 포스팅한 방법은 입력한 숫자를 단순히 나누어서 몫을 계속해서 나누는 방법이였다.
이러한 방법이 코드를 작성하는데 어려움 없이 쓸 수 있지만 숫자가 커지게 되면 연산도 많이 하게 되어
프로그램 시간이 오래 걸리게 된다. 이런 연산을 간소화 하기 위해 다음과 같은 방법을 사용한다.
1 ~ 9 까지의 자연수 : 9개 -> 1자리, 자리수 개수 : 9X1 = 9개
10 ~ 99 까지의 자리수 : 90개 -> 2자리, 자리수 개수 : 90X2 = 180개
100 ~ 999 까지의 자리수 : 900개 -> 3자리, 자리수 개수 : 900X3 = 2700개
if ) 15를 입력했다면 9+(15-9)*2 = 21개
15에서 9를 뺀 후 2를 곱해줘야 두자리수의 총 개수가 나온다.
if ) 256을 입력했다면 9+180+(256-99)*3 = 660개
마찬가지로 256에서 99를 뺀 후 3을 곱하면 세자리수의 총 개수가 나온다.
소스코드
#include<stdio.h>
using namespace std;
int main(){
int n,sum=0,d=9,cnt=1,res=0;
scanf("%d",&n);
while(sum+d<n){
res=res+(d*cnt);
sum=sum+d;
d=d*10;
cnt++;
}
res=res+((n-sum)*cnt);
printf("%d",res);
return 0;
}
'C | C++' 카테고리의 다른 글
[c\c++] 포인터 & 메모리관점(리눅스) (0) | 2021.08.22 |
---|---|
[C\C++] 소수 구하기 (0) | 2021.07.02 |