fork download
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using int_t = long long;
  5. constexpr int_t N = 1000000LL;
  6.  
  7. inline int sumDigits(int_t n, int dig, int& s)
  8. {
  9. auto even = !(dig % 2);
  10. auto sum = 0;
  11. for (; n; n /= 10, s = -s) sum += s * (n % 10);
  12. return even ? -sum : sum;
  13. }
  14.  
  15. inline int sumDigits(int_t n, int dig)
  16. {
  17. auto s = 1;
  18. return sumDigits(n, dig, s);
  19. }
  20.  
  21. inline int_t sub(int dig)
  22. {
  23. return dig == 1 ? 0 : static_cast<int_t>(std::pow(10.0, dig - 1));
  24. }
  25.  
  26. inline int_t odd(int_t n, int dig)
  27. {
  28. return (n - sub(dig)) / 2 + ((n % 2) ? 1 : -sumDigits(n, dig));
  29. }
  30.  
  31. inline int_t even(int_t n, int dig)
  32. {
  33. auto sum = 0LL, b = 0LL, z = 1LL, x = (n - sub(dig)) / 10;
  34. for (auto s = -1; n; n /= 10, s = -s, x /= 10, z *= 10) {
  35. int d = n % 10;
  36. sum += s * ((x * 45 + (d * (d - 1) / 2)) * z + d * (b + 1));
  37. b += d * z;
  38. }
  39. return sum;
  40. }
  41.  
  42. int solve(int_t n)
  43. {
  44. auto sum = 0LL;
  45. auto dig = static_cast<int>(std::floor(std::log10(n))) + 1;
  46. if (dig > 1) sum = 5;
  47. if (dig > 2) for (int i = 2, a = 45, s = -1; i < dig; ++i, a *= 10, s = -s) sum += a * s;
  48. return sum + ((dig % 2) ? odd(n, dig) : -even(n, dig));
  49. }
  50.  
  51. int main()
  52. {
  53. auto sign = 1;
  54. auto testsum = 0LL;
  55. for (auto i = 1LL; i < N; ++i) {
  56. testsum += sumDigits(i, static_cast<int>(std::floor(std::log10(i))) + 1, sign);
  57. if (solve(i) != testsum) {
  58. std::cout << "Error! " << i << ": " << testsum << ", " << solve(i) << std::endl;
  59. return 1;
  60. }
  61. }
  62. }
Success #stdin #stdout 1.22s 3140KB
stdin
Standard input is empty
stdout
Standard output is empty