본문 바로가기
Programming/BOJ

백준 #1081 합

by 작은별하나 2019. 12. 31.
반응형

숫자가 주어지면, 숫자에 있는 모든 자릿수의 합을 구할 수 있습니다.  예를 들어서 \(47 \to 4+7=11\)이 됩니다.  이 문제는 주어진 숫자 범위에 있는 모든 수에 대한 자릿수의 합을 구하는 것입니다.

 

digit sum

 

이미 이 문제는 #1019에서 다루었던 것입니다.  단지 다른 것은 #1019 문제는 1부터 주어진 숫자까지의 자릿수 합이지만, 여기서는 시작하는 숫자가 주어진다는 것뿐입니다.  #1019는 모든 자릿수들의 빈도를 출력하는 것이지만, 이 문제는 합을 표현하는 것입니다.  아이러니하게 #1019는 난이도가 Gold I 이지만, 이문제는 두단계 낮은 Gold III입니다.

 

https://www.acmicpc.net/problem/1081

 

1081번: 합

첫째 줄에 L과 U이 주어진다. U은 0보다 크거나 같고, 2,000,000,000보다 작거나 같은 정수이고, L은 0보다 크거나 같고, U보다 작거나 같은 정수이다.

www.acmicpc.net

문제의 풀이는 #1019 문제를 참고하세요.

https://sdev.tistory.com/282

불러오는 중입니다...

 

소스는 #1019 문제와 대동소이합니다.  소스는 참고용으로 봐주세요.

//------------------------------------------------------------------------------
//  baekjoon #1081 - Digit Sum
//    - by Aubrey Choi
//    - created at 2019-12-31
//------------------------------------------------------------------------------
#include <stdio.h>

//  from #1019
long long sum(long long n)
{
  if(n<=0) return 0;
  long long c[10]={0,}, s=1, sum=0, t, r;
  while(n>0)
  {
    t = n / (s * 10);
    r = n % (s * 10);
    for(int i = 0; i < 10; i++) c[i] += t*s;
    for(int i = 1; i <= r / s; i++) c[i] += s;
    c[(r/s+1)%10] += r % s;
    n -= 9 * s;
    s *= 10;
  }
  for(int i = 1; i < 10; i++) sum+=i*c[i];
  return sum;
}
int main()
{
  long long a, b;
  scanf("%lld%lld", &a, &b);
  printf("%lld\n",sum(b)-sum(a-1));
}
728x90

'Programming > BOJ' 카테고리의 다른 글

백준 #1094 막대기  (0) 2020.01.01
백준 #1083 소트(정렬)  (0) 2019.12.31
백준 #1074 Z  (0) 2019.12.30
백준 #1068 트리  (0) 2019.12.30
백준 #1067 이동(FFT)  (0) 2019.12.30

댓글