fork download
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int nonzero(int number) //функция,которая считает количество цифр,не равных нулю,кроме последней
  6. {
  7. int count = 0;
  8. number /= 10;
  9. while (number != 0) {
  10. if (number % 10 != 0) count++;
  11. number /= 10;
  12. }
  13. return count;
  14. }
  15. int summa(int number) //функция,которая возвращает сумму цифр числа
  16. {
  17. int sum = 0;
  18. while (number != 0) {
  19. sum += number % 10;
  20. number /= 10;
  21. }
  22. return sum;
  23. }
  24. bool edinica(int number) //функция,которая проверяет есть ли среди цифр числа,кроме последней, единица
  25. {
  26. number /= 10;
  27. bool ok = false;
  28. while (number != 0) {
  29. if (number % 10 == 1) ok = true;
  30. number /= 10;
  31. }
  32. return ok;
  33. }
  34. int kol_vo(int number) //функция,вычисляющая кол-во цифр числа
  35. {
  36. int count = 0;
  37. while (number != 0) {
  38. count++;
  39. number /= 10;
  40. }
  41. return count;
  42. }
  43. int formula(int number) //формула,по которой можно дойти от 1 до 10^(a-1),где a- кол-во цифр числа
  44. {
  45. int a = kol_vo(number);
  46. return (5 * a - 1) * (a - 1);
  47. }
  48.  
  49. int main() {
  50. //инииализируем переменную t и считываем ее с клавиатуры
  51. int t;
  52. cin >> t;
  53. //инициализируем переменную ni и задаем цикл,который будет работать пока мы вводим значения ni и t>0
  54. int ni;
  55. while (cin >> ni and t > 0) {
  56. //кладем в переменную kol_vo1 значение функции kol_vo от значения ni
  57. int kol_vo1 = kol_vo(ni);
  58. //появляется необходимость создать переменную,которая будет равна значению ni,так как с этим значением
  59. //в дальнейшем будут проводится операции,а в конце программы нам нужно будет обратиться к исходному значению ni
  60. int a = ni;
  61. //задаем массив,размерность которого равна кол-ву цифр числа
  62. int b[kol_vo1];
  63. for (int i = 0; i < kol_vo1; i++) {
  64. b[i] = a % 10;
  65. a /= 10;
  66. }
  67. //далее производим проверку условия №2,которое описано в решении. Если число проходит условие,то
  68. //выводим соответствующую формулу,указанную в условии №2
  69. bool ok = false;
  70. for (int i = 0; i < kol_vo1 - 1; i++) {
  71. if (b[i] == 0) ok = true;
  72. else {
  73. ok = false;
  74. break;
  75. }
  76. }
  77. if (b[kol_vo1 - 1] > 1 and ok == true) {
  78. cout << summa(--ni) + nonzero(--ni) - edinica(--ni) + formula(ni) << endl;
  79. }
  80. //далее производим проверку условия №1,которое описано в решении. Если число проходит условие,то
  81. //выводим соответствующую формулу,указанную в условии №1
  82. bool ok2 = false;
  83. for (int i = 0; i < kol_vo1 - 1; i++) {
  84. if (b[i] != 0) ok2 = true;
  85. }
  86. if (ok2 == true) cout << summa(ni) + nonzero(ni) - edinica(ni) - 1 + formula(ni) << endl;
  87. //остались крайние случаи,когда число однозначное или кратное 10^n.Проверяем число на эти условия
  88. //и если оно является таковым,выводим соответствующие значения
  89. if (kol_vo1 == 1) cout << ni - 1 << endl;
  90. if (ni == 10 or ni == 100 or ni == 1000 or ni == 10000 or ni == 100000 or ni == 1000000 or ni == 10000000 or ni == 100000000 or ni == 1000000000) cout << formula(ni) << endl;
  91. //декрементируем переменную t
  92. t--;
  93. }
  94. }
Success #stdin #stdout 0s 5504KB
stdin
4
137
318
3028
300
stdout
39
40
71
50