fork download
  1. #include <iostream>
  2.  
  3.  
  4. unsigned long long getClosestWith7(unsigned long long n, unsigned int k)
  5. {
  6. // Count number of digits
  7. unsigned long long tmp = n;
  8. unsigned int m = 0, mK = 0;
  9. while(tmp > 0)
  10. {
  11. if(tmp % 10 == 7) mK++;
  12. tmp /= 10;
  13. m++;
  14. }
  15.  
  16. // Distinct cases
  17. if(k == mK && n != 0)
  18. return n;
  19. else if(k >= m || n == 0) // implicit: k != mK
  20. {
  21. unsigned long long r = 0;
  22. while(k > 0)
  23. {
  24. r = 10 * r + 7;
  25. k--;
  26. }
  27. return r;
  28. }
  29. else if(k > mK) // implicit: k != mK, k < m
  30. {
  31. unsigned long long r = n;
  32. unsigned long long s = 0;
  33. m = 0;
  34. while(mK < k)
  35. {
  36. if(r % 10 != 7) mK++;
  37. r /= 10;
  38. m++;
  39. }
  40. if(r % 10 == 8) // special case
  41. s = 79 + 100 * (r / 10);
  42. while(m > 0)
  43. {
  44. r = 10 * r + 7;
  45. if(s != 0 && m > 1) // special case
  46. s = 10 * s + 7;
  47. m--;
  48. }
  49. return (r < n && n - r < n - s) || (r >= n && r - n < n - s) ? r : s;
  50. }
  51. else // implicit : k < mK
  52. {
  53. // Generate a and b
  54. unsigned long long a = n;
  55. unsigned long long b = 0;
  56. m = 0;
  57. while(mK > k)
  58. {
  59. if(a % 10 == 7) mK--;
  60. a /= 10;
  61. m++;
  62. }
  63. b = 10 * a + 8;
  64. a = 10 * a + 6;
  65. m--;
  66. while(m > 0)
  67. {
  68. a = 10 * a + 9;
  69. b = 10 * b + 0;
  70. m--;
  71. }
  72.  
  73. // Compare (return lowest if equal)
  74. return n - a <= b - n ? a : b;
  75. }
  76. }
  77.  
  78. #define CLOSEST7( N , K ) \
  79.   std::cout << "N = " << N << ", K = " << K << " => N' = " << getClosestWith7(N,K) << "\n"
  80.  
  81. int main()
  82. {
  83. CLOSEST7(1773,3);
  84. CLOSEST7(83,1);
  85. CLOSEST7(17273,3);
  86. CLOSEST7(1273679750,6);
  87. CLOSEST7(1773,1);
  88. CLOSEST7(83,5);
  89. CLOSEST7(0,2);
  90. CLOSEST7(0,0);
  91. }
Success #stdin #stdout 0s 2856KB
stdin
Standard input is empty
stdout
N = 1773, K = 3 => N' = 1777
N = 83, K = 1 => N' = 79
N = 17273, K = 3 => N' = 17277
N = 1273679750, K = 6 => N' = 1273677777
N = 1773, K = 1 => N' = 1769
N = 83, K = 5 => N' = 77777
N = 0, K = 2 => N' = 77
N = 0, K = 0 => N' = 0