Миша иногда читал книги. Но и это он делал странным способом: начинал он всегда с первой страницы и читал ежедневно ровно столько страниц, сколько равна сумма цифр номера страницы, с которой он начинал читать в соответствующий день. То есть, в первый день он читал одну страницу, потом две, четыре, восемь и так далее. Помогите отцу Миши выяснить, какой день его сын читает книгу, если сейчас Миша читает 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%? Как решить эту проблему?
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;
}
Если я правильно понял задачу, то вот решение:
#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;
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей