Theory:
from 0 to 99 there are 2*10^1=20 for each 0 to 9 digits.
from 0 to 999 there are 3*10^2=300 for each 0 to 9 digits.
so the foemulae is for 0 to n number of 9’s n*10^(n-1) for each 0 to 9 digits.
And so, for upto 445 we can find total number of digits by splitting 445=400+40+5
upto 0 to 400 total number of digits=4*(2*10^1)=80 0 to 9 each and and plus there will 100 of 1 upto 3 each.
so total sum of all the digits 0 upto 400 = 80 + 80*2 + 80*3 + 80*4 +…+80*9 + (1*100 + 2*100 + 3*100) + 4(single most significant digit)=4204
same way 0 to 40 total sum = 4 + 4*2 + 4*3 + ….+ 4*9 + (1*10 + 2*10 + 3*10) + 4 = 244
so from 401 upto 440 there will be additional 40 4’s will be added so 244+40*4=244+160=404
and for 0 to 5 total sum = 0 + (1*1 + 2*1 + 3*1 + 4*1)+5 = 15
so from 441 upto 445 there will be additional (5*2)=10 4’s will be added so 15+40=55
so total sum of digits = 4204+404+25 = 4663
Solution:
#include <iostream>
#include <string.h>
#define lld long long
using namespace std;
lld Digit[10],Digit2[10];
int getLenth(lld a)
{
if(a<=9)
return 0;
int l=0;
while(a)
{
a/=10;
l++;
}
l--;
//cout<<l<<"\n";
return l;
}
int calDigit(lld n,lld digit[10])
{
int pwr=-1,msd;
lld org=n;
lld mult=0;
if(n==0)
{
return 0;
}
if(n<=9)
{
for(int i=1;i<=n;i++)
digit[i]+=1;
return 0;
}
while(n)
{
if(n<=9)
msd=n;
n/=10;
mult*=10;
pwr++;
if(pwr==1)
mult=1;
}
//like 0 to 99 2*1o^1 for each 0 to 9 and for upto 445 or 399 is msd*20=80 ,i.e n*10^(n-1),pwr=n and mult=10^(n-1),,msd = for each msd*(10^n)
//cout<<(pwr)*mult<<"\n";
//digit[0]+=(mult*msd);
for(int i=0;i<10;i++)
digit[i]+=(msd*pwr*mult);
for(int i=0;i<msd;i++)
digit[i]+=(mult*10);//mult=10^(power-1)
digit[msd]+=(org+1-(msd*mult*10));
calDigit(org%(mult*10),digit);
return 0;
}
int main()
{
lld n,m;
//calDigit(1234567,Digit);
while(cin>>n)
{
cin>>m;
memset(Digit,0,sizeof(Digit));
memset(Digit2,0,sizeof(Digit2));
if(n==0 && m==0)
break;
if(n)
{
calDigit(n-1,Digit);
}
else
Digit[0]=0;
calDigit(m,Digit2);
lld res =0;
for(int i=1;i<10;i++)
{
res+=((Digit2[i]-Digit[i])*i);
}
cout<<res<<"\n";
}
return 0;
}