( ), , , .
S (n) - 0 <= k < .
D (k) - k.
( > , Dx = D (x)
n >= 10, n, (n = 10 * k + r) (k, r - )
S (n) = S (10 * k + r) = S (10 * k) + D (10 * k + 1) +... + D (10 * k + r)
S (10 * k) :
S (10 * 1) = D1 + D2 + D3 +... + D9 = (1 + 2 + 3 +... + 9) * 1 + D10
S (10 * 2) = D1 + D2 + D3 +... + D19 = (1 + 2 + 3 +... + 9) * 2 + 1 * 9 + D10 + D20
S (10 * 3) = D1 + D2 + D3 +... + D29 = (1 + 2 + 3 +... + 9) * 3 + 1 * 9 + 2 * 9 + D10 +... + D20 + D30
So S (10 * k)= (1 + 2 + 3 +... + 9) * k + 9 * S (k-1) + S (k-1) + D (10 * k) = 45 * k + 10 * S (k-1) + D (10 * k)
, D (10 * k + x) = D (10 * k) + D (x) = D (k) + x, :
D (10 * k + 1) +... + D (10 * k + r) = D (k) +1 + D (k) +2 +... D (k) + r = rD (k) + (1 + 2 +... + r) = rD (k) + r * (1 + r)/2
, ( D (k)), :
S (n) = 45 * k + 10 * S (k-1) + (1 + r) D (k) + r * (1 + r)/2
k r, :
S (n) = 45 * k + 10 * S ((n/10) -1) + (1 + n% 10) D (n/10) + n% 10 (1 + n% 10)/2
S(n):
if n=0, sum=0
if n<10, n*(1+n)/2
r=n%10
k=n/10
return 45*k + 10*S((n/10)-1) + (1+n%10)*D(n/10) + n%10*(1+n%10)/2
D(n):
just sum digits
( ) #
static BigInteger Solution(BigInteger n)
{
if (n <= 0)
return 0;
if (n < 10)
return (n * (n + 1)) / 2;
long x = long.Parse(n.ToString().Substring(0, 1));
long y = long.Parse(n.ToString().Substring(1));
BigInteger power = BigInteger.Pow(10, n.ToString().Length - 1);
var log = Math.Round(BigInteger.Log10(power));
return (power * Solution(x - 1))
+ (x * (y + 1))
+ (x * 45*new BigInteger(log)* BigInteger.Pow(10,(int)log-1))
+ Solution(y);
}
( ) #
static BigInteger Solution2(BigInteger n)
{
if (n <= 0)
return 0;
if (n < 10)
return (n * (n + 1)) / 2;
BigInteger r = BigInteger.ModPow(n, 1, 10);
BigInteger k = BigInteger.Divide(n, 10);
return 45 * k
+ 10*Solution2(k-1)
+ (1+r) * (k.ToString().ToCharArray().Select(x => int.Parse(x.ToString())).Sum())
+ (r * (r + 1)) / 2;
}
EDIT. , , ( ), Solution (power-1) .
PS: , , first last, , .