Nice exercise for saturday night, thanks:
#include <stdio.h>
#include <tchar.h>
double Dix(const TCHAR* anum,const unsigned int nnum,const unsigned int ix)
{
return ix<nnum?(double)(anum[ix]-'0'):0.0;
}
double HornerSchema(const TCHAR* anum,const unsigned int nnum,const unsigned int lo,const unsigned int hi)
{
double res = 0.0;
unsigned int ix;
for(ix=hi;lo<ix;ix--) res = res*10.0 + Dix(anum,nnum,nnum-ix);
for(;0<ix;ix--) res *= 10.0;
return res;
}
double Upper(const TCHAR* anum,const unsigned int nnum,const unsigned int pos)
{
return HornerSchema(anum,nnum,pos+1,nnum);
}
double Lower(const TCHAR* anum,const unsigned int nnum,const unsigned int pos)
{
return HornerSchema(anum,nnum,0,pos);
}
double Pow10(const unsigned int pos)
{
double res = 1.0;
unsigned int ix;
for(ix=0;ix<pos;ix++) res*=10.0;
return res;
}
unsigned int Digit(const TCHAR* anum,const unsigned int nnum,const unsigned int pos)
{
return pos<nnum?(unsigned int)(anum[nnum-pos-1]-'0'):0;
}
double HSum(const TCHAR* anum,const unsigned int nnum)
{
double sum = 0.0;
unsigned int i,di;
double hi,lo;
double hisum,disum,llsum;
double ASUM[] = { 0,0,1,3,6,10,15,21,28,36,45 };
for(i=0;i<nnum;i++)
{
hi = Upper(anum,nnum,i);
di = Digit(anum,nnum,i);
lo = Lower(anum,nnum,i);
hisum = hi*4.5;
disum = Pow10(i)*ASUM[di];
llsum = di*(lo+1.0);
sum += hisum+disum+llsum;
}
return sum;
}
int _tmain(int argc, _TCHAR* argv[])
{
const TCHAR number[] = __T("98765432100123456789");
double sum;
sum = HSum(number,(sizeof(number)/sizeof(number[0]))-1);
if(1e15<sum) _tprintf(__T("%s = ~ %.15G"),number,sum);
else _tprintf(__T("%s = %.0lf"),number,sum);
_gettch();
return 0;
}
123 = 1038
13579 = 235360
123123123123 = 6018595171770
9,87654321001235E+19 = 8,87700045735992E+21
Regards.