Compute sum of digits in all numbers from 1 to n - GeeksforGeeks
Given a number x, find sum of digits in all numbers from 1 to n.
A naive solution is to go through every number x from 1 to n, and compute sum in x by traversing all digits of x.
Read full article from Compute sum of digits in all numbers from 1 to n - GeeksforGeeks
Given a number x, find sum of digits in all numbers from 1 to n.
sum(9) = 1 + 2 + 3 + 4 ........... + 9
= 9*10/2
= 45
sum(99) = 45 + (10 + 45) + (20 + 45) + ..... (90 + 45)
= 45*10 + (10 + 20 + 30 ... 90)
= 45*10 + 10(1 + 2 + ... 9)
= 45*10 + 45*10
= sum(9)*10 + 45*10
sum(999) = sum(99)*10 + 45*100
In general, we can compute sum(10d – 1) using below formula
sum(10d - 1) = sum(10d-1 - 1) * 10 + 45*(10d-1)
// Function to computer sum of digits in numbers from 1 to n// Comments use example of 328 to explain the codeint sumOfDigitsFrom1ToN(int n){ // base case: if n<10 return sum of // first n natural numbers if (n<10) return n*(n+1)/2; // d = number of digits minus one in n. For 328, d is 2 int d = log10(n); // computing sum of digits from 1 to 10^d-1, // d=1 a[0]=0; // d=2 a[1]=sum of digit from 1 to 9 = 45 // d=3 a[2]=sum of digit from 1 to 99 = a[1]*10 + 45*10^1 = 900 // d=4 a[3]=sum of digit from 1 to 999 = a[2]*10 + 45*10^2 = 13500 int *a = new int[d+1]; a[0] = 0, a[1] = 45; for (int i=2; i<=d; i++) a[i] = a[i-1]*10 + 45*ceil(pow(10,i-1)); // computing 10^d int p = ceil(pow(10, d)); // Most significant digit (msd) of n, // For 328, msd is 3 which can be obtained using 328/100 int msd = n/p; // EXPLANATION FOR FIRST and SECOND TERMS IN BELOW LINE OF CODE // First two terms compute sum of digits from 1 to 299 // (sum of digits in range 1-99 stored in a[d]) + // (sum of digits in range 100-199, can be calculated as 1*100 + a[d] // (sum of digits in range 200-299, can be calculated as 2*100 + a[d] // The above sum can be written as 3*a[d] + (1+2)*100 // EXPLANATION FOR THIRD AND FOURTH TERMS IN BELOW LINE OF CODE // The last two terms compute sum of digits in number from 300 to 328 // The third term adds 3*29 to sum as digit 3 occurs in all numbers // from 300 to 328 // The fourth term recursively calls for 28 return msd*a[d] + (msd*(msd-1)/2)*p + msd*(1+n%p) + sumOfDigitsFrom1ToN(n%p);}A naive solution is to go through every number x from 1 to n, and compute sum in x by traversing all digits of x.
int sumOfDigitsFrom1ToN(int n){ int result = 0; // initialize result // One by one compute sum of digits in every number from // 1 to n for (int x=1; x<=n; x++) result += sumOfDigits(x); return result;}// A utility function to compute sum of digits in a// given number xint sumOfDigits(int x){ int sum = 0; while (x != 0) { sum += x %10; x = x /10; } return sum;}Read full article from Compute sum of digits in all numbers from 1 to n - GeeksforGeeks