Задача на С++ “Книга”

272
04 мая 2018, 12:40
Книга

Миша иногда читал книги. Но и это он делал странным способом: начинал он всегда с первой страницы и читал ежедневно ровно столько страниц, сколько равна сумма цифр номера страницы, с которой он начинал читать в соответствующий день. То есть, в первый день он читал одну страницу, потом две, четыре, восемь и так далее. Помогите отцу Миши выяснить, какой день его сын читает книгу, если сейчас Миша читает k-ую страницу книги.

Входные данные:

Номер страницы k (0 < k < 5000), которую сейчас читает Миша.

Выходные данные:

Номер дня, который Миша читает книгу.

Мой код:
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,d=0,x, sum=0;
    cin>>n;
    for(int i=0;i<n;i++){
        int s=1;
        x=sum;
        if(sum<10){
        sum=sum+sum;
        }
        else {
            while(x!=0){
            sum+=sum%10;
            x/=10;
            }
        }
        sum=sum+s;
        if(sum>=n){
        d++;
        cout<<d;
        return 0;
        }
        else d++;
    }
}
Вопрос:

Почему при проверке только 30%? Как решить эту проблему?

Answer 1
int main()
{
  int n, day = 1, sum = 1; // переменная s не нужна, 1 страница - просто инициализация
  cin>>n;
  if (n == 1) {
    cout << day;
    return 0;
  }
  while(true){
    int x = sum;
    // x < 10 не является специальным случаем
    while(x!=0){
      sum += x % 10; // Ошибка! всегда считалась только последняя цифра суммы
      x /= 10;
    }
    day++; // операции, выполняющиеся безусловно стоит выносить из условия
    if(sum >= n){
      cout << day;
      break;
    }
  }
  return 0;
}
Answer 2

Если я правильно понял задачу, то вот решение:

#include<iostream>
int sum(int);
int main(int argc, char *argv[])
{
    int size {};
    std::cout << "Input size:\n";
    std::cin >> size;
    int day {1};
    for(int i {1}; i <= size; ++day) {
        i += sum(i);
    }
    std::cout << --day << std::endl;
    return 0;
}
int sum(int x)
{
    int s {};
    if (x / 10) {
        s += x % 10;
        return s += sum(x / 10);
    }
    else {
        return s += x;
    }
}
READ ALSO
Ошибка исполнения. Проблема с векторами. c++

Ошибка исполнения. Проблема с векторами. c++

Я пытаюсь создать вектор состоящий из векторов целых чисел, где в каждом из N элементов, есть три различных элементаПри запуске данного кода...

259
Взаимодействие с мышкой в 3D игре на С\C++ под Win

Взаимодействие с мышкой в 3D игре на С\C++ под Win

Есть команда на С++ - SetCursorPos(X,Y);, которая позволяет перемещать мышку по экрануТо есть, вводишь определенные координаты и курсор мышки перемещается...

243
Перехват событий клавиатуры в linux системе

Перехват событий клавиатуры в linux системе

Задача состоит в создании прослойки между ядром и пользовательским приложением ( либо какой-либо другой вариант) для перехвата событий клавиатуры...

234
createInvestment из книги Скотта Майерса Правило 18

createInvestment из книги Скотта Майерса Правило 18

Что Майерс хотел сказать следующим кодом

248