# Compute sum of digits in all numbers from 1 to n

Dynamic ProgrammingData StructureAlgorithms

In this problem, we have to find the sum of digits of all numbers in range 1 to n. For an example the sum of digits of 54 is 5 + 4 = 9, Like this, we have to find all the numbers and their sum of digits.

We know that there are 10d - 1 numbers can be generated, whose number of digits is d. To find the sum of all those numbers of digit d, we can use a recursive formula.

sum(10d- 1)=sum(10d-1- 1)*10+45*(10d-1)

## Input and Output

Input:
This algorithm takes the upper limit of the range, say it is 20.
Output:
Sum of digits in all numbers from 1 to n. Here the result is 102

## Algorithm

digitSumInRange(n)

Input: The upper limit of the range.

Output − the sum of digits for all number in the range (1-n).

Begin
if n < 10, then
return n(n+1)/2
digit := number of digits in number
d := digit – 1
define place array of size digit
place := 0
place := 45

for i := 2 to d, do
place[i] := place[i-1]*10 + 45 * ceiling(10^(i-1))
power := ceiling(10^d)
msd := n/power
res := msd*place[d] + (msd*(msd-1)/2)*power +
msd*(1+n mod power) + digitSumInRange(n mod power)
return res
done
End

## Example

#include<iostream>
#include<cmath>
using namespace std;

int digitSumInRange(int n) {
if (n<10)
return n*(n+1)/2;          //when one digit number find sum with formula
int digit = log10(n)+1;       //number of digits in number
int d = digit-1;           //decrease digit count by 1

int *place = new int[d+1];    //create array to store sum upto 1 to 10^place[i]
place = 0;
place = 45;

for (int i=2; i<=d; i++)
place[i] = place[i-1]*10 + 45*ceil(pow(10,i-1));

int power = ceil(pow(10, d));    //computing the power of 10
int msd = n/power;               //find most significant digit
return msd*place[d] + (msd*(msd-1)/2)*power +
msd*(1+n%power) + digitSumInRange(n%power);    //recursively find the sum
}

int main() {
int n;
cout << "Enter upper limit of the range: ";
cin >> n;
cout << "Sum of digits in range (1 to " << n << ") is: " << digitSumInRange(n);
}

## Output

Enter upper limit of the range: 20
Sum of digits in range (1 to 20) is: 102