-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
1

Не понимаю задачу

11.03.2019, 19:07. Показов 5105. Ответов 24

Здравствуйте. Не понимаю как решить и не понимаю вообще задачку которую мне нужно сдать. Прошу вас помочь.

У Миши развитое эстетическое чувство. Он считает, что не все числа одинаково порядочные. Когда ему грустно, он начинает придумывать числа и приводить их в порядок.

Миша очень любит рассматривать сумму цифр числа. Для того чтобы привести в порядок число A, он сначала записывает само число. Потом он пишет сумму цифр этого числа. Затем — сумму цифр суммы цифр и так далее, до тех пор, пока очередное число не станет однозначным. Он считает, что результатом приведения в порядок числа A является сумма всех выписанных чисел, включая само число A.

Миша настолько любит этот процесс, что он даже заменяет ему счёт овец, когда долго не получается заснуть. Он помнит, что вчера ночью, когда он в уме привёл в порядок число A, у него получилось число B. Но вот беда — он не помнит, какое именно он взял число A! Помогите ему в отыскании этого числа.

Входные данные
На ввод подаётся единственное целое число B (1 ≤ B ≤ 109 )

Выходные данные
Если существует такое число A, что после приведения его в порядок, получается B, то выведите любое такое число. Если же Миша где-то ошибся в расчётах и такого числа не существует, то выведите -1.

Примеры тестов
входные данные
42
выходные данные
29
входные данные
20
выходные данные
-1
Примечание
Пояснение к первому примеру. Последовательность сумм цифр для 29 состоит из чисел 29, 11, 2. Соответственно, после приведения в порядок число 29 превращается в число 42 = 29 + 11 + 2.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2019, 19:07
Ответы с готовыми решениями:

Не понимаю как выполнить задачу без массивов
Строго возрастающая последовательность целых чисел поочерёдно вводится с клавиатуры. Разработать...

Прошу поддержки, плохо понимаю как писать через стэк, нужно написать задачу связанную со строчкой
Задача такова: "задан текст напечатать все слова которые отличны от последнего слова и...

Не понимаю эту задачу, разъясните
Города A и В соединены однопутной железной дорогой длиной "n" километров. На этой дороге имеется...

Не совсем понимаю решенную задачу по прологу
Добрый вечер. pr1(, ). pr1(, ). pr1(, ). pr1(, ). pr1(, ) :- pr1(T1, T2).Общая суть задачи...

24
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
11.03.2019, 19:41 2
Лучший ответ Сообщение было отмечено CyberNinjaProg как решение

Решение

Смотрите. Вам нужно действовать по следующему алгоритму:
1) Проходить в цикле от 1 до числа B.
2) Для каждого числа с цикла - рекурсивно разложить его на цифры, просуммировать цифры и сложить с глобальной суммой до тех пор, пока число станет состоять с одной цифры
3) Проверить, является ли глобальная сумма равна введённому числу.

Для того, чтобы раскладывать число на цифры и их суммировать - можно действовать так:
C++
1
2
3
4
5
6
7
int number = 42;
int sum = 0;
while((double)number / 10)
{
    sum += number % 10;
    number /= 10;
}
Пишите, если не будет получаться - помогу с кодом.
0
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
11.03.2019, 19:55  [ТС] 3
Хорошо, спасибо. Сейчас сидеть с кодом буду. Позже вам напишу))) Еще раз огромное спасибо!!!

Добавлено через 13 минут
Извините. Я немного запутался. Не могли бы вы подсказать что я делаю неправильно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
int main() {
    int b,s,sglob;
    std::cin >> b;
    s = 0;
    sglob=0;
    for (int i = 1; i<b; i++){
        do{
            while(b/10){
                s+=b%10;
                b /=10;
                sglob = sglob +s;
            }
        }while(sglob == b);
    }
    if(sglob>b){
        std::cout<<-1;
    } else  std::cout<<sglob;
}
там где if(sglob>b)-понятно скорее что это не правильно. я не много не понял вот это: 3) Проверить, является ли глобальная сумма равна введённому числу.

Пожалуйста, можете помочь.
0
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
11.03.2019, 20:02 4
Код рекурсивной функции, которую Вам нужно будет вызывать в цикле от 1 до B:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void getSumOfNumerals(int number, int& globalSum)
{
    int sum = 0;
    while((double)number / 10)
    {
        sum += number % 10;
        number /= 10;
    }
    
    globalSum += sum;
    if (sum / 10)
        getSumOfNumerals(sum, globalSum);
}
Обратите внимание на то, что вторая переменная в функции (globalSum) передаётся по ссылке, а значит, её можно использовать для проверки вне функции

C++
1
2
3
4
int number = 29;
int globalSum = 0;
getSumOfNumerals(number, globalSum);
std::cout << globalSum << std::endl;//Здесь globalSum == 42
0
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
11.03.2019, 20:09  [ТС] 5
Простите пожалуйста. Я совсем запутался... Можете еще раз объяснить...
0
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
11.03.2019, 20:14 6
Лучший ответ Сообщение было отмечено CyberNinjaProg как решение

Решение

Не волнуйтесь, Вы новичок и поэтому не должны беспокоиться об том, что что-то не знаете.
Вам нужно сделать такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
b = 42;
for(int i = 1; i < b; i++)
{
    int globalSum = 0;
    getSumOfNumerals(i, globalSum);
    if (globalSum == b)
    {
        std::cout << "Nice. Number is" << i << std::endl;
        return;
    }
}
std::cout << "Bad :( - " << -1 << std::endl;
0
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
11.03.2019, 20:22  [ТС] 7
Спасибо вам большое! Редко встречаются нынче такие добрые люди) Но еще раз проверю. Значит:
1) я беру функцию void getSumofNumerals(int number, int &, globalSum) и вставляю ее в начало программы.
2) далее в int main() я прописываю ввод b, цикл for, вызов функции и тд, но зачем вы написали: вывести Bad?)
0
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
11.03.2019, 20:26 8
Цитата Сообщение от CyberNinjaProg Посмотреть сообщение
Спасибо вам большое! Редко встречаются нынче такие добрые люди)
Незачто, сам был таким же, как Вы сейчас)

Цитата Сообщение от CyberNinjaProg Посмотреть сообщение
но зачем вы написали: вывести Bad?)
Чисто чтобы добавить немного юмора в этот серьёзный код

Да, всё то, что Вы написали верно, но я бы рекомендовал сам цикл описать в другой функции, чтобы Вы не вышли с main(), как только найдёте число (return моментально выйдет с программы, если сработает в main() и Вы не успеете увидеть результат в консоли)
0
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
11.03.2019, 20:38  [ТС] 9
Согласен)))) Юмор всегда нужен. Но к сожалению я где-то накосячил и у меня ничего не выводится. Можете пожалуйста проверить?
А так вам ОГРОМЕННОЕ СПАСИБО!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
void getSumOfNumerals(int i, int& globalSum)
{
    int sum = 0;
    while((double)i / 10)
    {
        sum += i % 10;
        i /= 10;
    }
 
    globalSum += sum;
    if (sum / 10)
        getSumOfNumerals(sum, globalSum);
}
 
int main(){
int b;
std::cin >> b;
for(int i = 1; i < b; i++){
    int globalSum = 0;
    getSumOfNumerals(i, globalSum);
    if (globalSum == b){
        std::cout << "Nice. Number is" << i << std::endl;
        return 0;
    }
  }
}
я сомневаюсь на счет i в функции это так?

Добавлено через 5 минут
Вы не успеете увидеть результат в консоли
А можно сделать так чтобы я увидел результат в консоли?
0
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
11.03.2019, 21:02 10
Цитата Сообщение от CyberNinjaProg Посмотреть сообщение
А можно сделать так чтобы я увидел результат в консоли?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
void getSumOfNumerals(int i, int& globalSum)
{
    int sum = 0;
    while((double)i / 10)
    {
        sum += i % 10;
        i /= 10;
    }
 
    globalSum += sum;
    if (sum / 10)
        getSumOfNumerals(sum, globalSum);
}
 
void checker(int b)
{
    for(int i = 1; i < b; i++)
    {
        int globalSum = 0;
        getSumOfNumerals(i, globalSum);
        if (globalSum == b)
        {
            std::cout << "Nice. Number is" << i << std::endl;
            return 0;
        }
    }
    std::cout << "Bad :( - " << -1 << std::endl;
}
 
int main()
{
    int b;
    std::cin >> b;
    checker(b);
    system("pause");
}
0
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
11.03.2019, 21:04  [ТС] 11
Простите за беспокойство. Спасибо. Все понял. Вы отличный и очень добрый человек)
1
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
11.03.2019, 21:05 12
Цитата Сообщение от CyberNinjaProg Посмотреть сообщение
Простите за беспокойство.
Не нужно извиняться за то, что Вы ещё новичок. Лучше помогите кому-то своими знаниями, когда будете ими обладать
0
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
11.03.2019, 21:08  [ТС] 13
Проблемка возникла. снова. на 25 строчке, где return 0; выдает ошибку
C:\b9\main.cpp|25|error: return-statement with a value, in function returning 'void' [-fpermissive]|
С чем она может быть связана
0
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
11.03.2019, 21:17 14
В 25-й строке замените
C++
1
return 0;
на
C++
1
return;
0
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
11.03.2019, 21:21  [ТС] 15
Да сработало. Но все же мне не выводится число(при вводе 42 не выводится 29,а следующей строчной после 42 выводится шуточная строка). Почему?
0
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
11.03.2019, 21:24 16
Что-то не так с алгоритмом. Попробуйте пройтись в отладочном режиме по коду и посмотреть, почему не работает (для этого, если Вы работаете в Visual Studio, поставьте точку останова на левом поле студии где-то в функции main(), запустите код и жмите стрелочки на второй панели сверху)
0
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
11.03.2019, 21:26  [ТС] 17
Я работаю в CodeBlocks. Пользуюсь этой
0
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
11.03.2019, 21:28 18
Цитата Сообщение от Krokodil9798 Посмотреть сообщение
C++
1
int globalSum = 0;
Замените это на
C++
1
int globalSum = i;
0
-3 / 3 / 0
Регистрация: 10.03.2019
Сообщений: 108
11.03.2019, 21:32  [ТС] 19
УРА! ПОБЕДА! сработало)
0
Krokodil9798
11.03.2019, 21:35     Не понимаю задачу
  #20

Не по теме:


Цитата Сообщение от CyberNinjaProg Посмотреть сообщение
УРА! ПОБЕДА! сработало)
Мои поздравления! :)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2019, 21:35

Не понимаю в сетях, а нужно задачу сделать
Хост с Ethernet-адресом ниже хочет выполнить самонастройку (IPv6 SLAAC.) Руководствуясь STD 86, 89,...

Доделать задачу с массивами, не понимаю сам
uses graphabc; var a:array of integer; i,n:integer; begin readln(n); for i:=1 to n...

Не понимаю задачу и ее условия! если можно с Объяснением
Вывести на экран фигуру A, образованную в пересечении основной и побочной диагонали: Матрица...

Не понимаю что не так делаю решая задачу
Вроде задача с одной стороны очень легкая, но я думаю над ней целый вечер. Условие В школе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru