Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2013, 17:41   #1
anton.dasuik
Пользователь
 
Регистрация: 25.01.2013
Сообщений: 16
По умолчанию Pascal робота с типом char

Дано натуральное N, что может иметь от 1 до 100 цифр и не начинается с нуля. Нужно найти наименьшее натуральное M> N и такое, что сумма цифр N равна сумме цифр M.
Как решать данную задачу, можно просто алгоритм или код, разобраться попробую сам
anton.dasuik вне форума Ответить с цитированием
Старый 21.02.2013, 18:44   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Как мне на халяву срубить n-ое кол-во денюжек, можно просто долларов или рублей, потратить попробую сам

На форуме живые люди, от которых, возможно, зависит Ваше дальнейшее обучение. И вместо того "задобрить" их, вы отдаете приказ.. (под задобрить понимается : 1) поприветствовать 2) показать что те усилия, которые они потратят на Вас будут не напрасны (= показать свои наработки) 3) за ранее поблагодарить)
Вот и есть тот минимум, который увеличит возможность получения ответа как минимум в двое..
Poma][a вне форума Ответить с цитированием
Старый 21.02.2013, 18:50   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

По-моему, вполне адекватная просьба:
Цитата:
Как решать данную задачу, можно просто алгоритм или код, разобраться попробую сам
Самая большая цифра, как известно - 9. Соответственно, самое маленькое число с заданной суммой цифр X имеет вид y99...9, где y - остаток от деления X на 9 (если y=0 и X<>0, y просто отсутствует). То есть, надо:
1) Найти сумму цифр исходного числа.
2) Найти остаток от деления её на 9 и вывести (или не вывести в обозначенном выше особом случае).
3) Вывести <сколько надо> девяток.

А. M>N. Раззява.
Тогда вопрос: как увеличить число, не меняя его сумму цифр? Ответ: уменьшить на 1 цифру в разряде и увеличить на 1 цифру в другом разряде, старше первого. Уменьшить цифру можно только если она не 0, увеличить - только если она не 9. Алгоритм:
1) Взять исходное число и идти по нему от младшего разряда.
2) Первую ненулевую цифру уменьшить на 1.
3) Идти дальше до первой цифры, не равной 9, увеличить её на 1.
4) Если в ходе выполнения пункта 3) число закончилось, приписать спереди 1 (фактически, увеличив на 1 ведущий ноль).
5) А теперь вместо "подчисла" после увеличенной цифры записать минимальное число с той же суммой цифр (см. предыдущий алгоритм) и тем же количеством цифр.
Код:
2735999000
2735998000
2736998000
2736000899
В принципе, алгоритм можно упростить - попробуйте на нескольких числах, чтобы понять дополнительную закономерность.

Последний раз редактировалось Abstraction; 21.02.2013 в 19:00.
Abstraction вне форума Ответить с цитированием
Старый 21.02.2013, 18:53   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Я так понимаю, у нас есть текстовая запись числа N (строка).
Идем с хвоста строки и пытаемся вычесть единичку из младшего разряда и прибавить ее с следующему по старшинству разряду.
Очевидно, это возможно при условии, когда младший разряд не менее 1, а следующий за ним менее 9.
Если оказалось, что единицу мы прибавили не ко второму с конца разряду, то "хвост" следует преобразовать так, чтобы возможно уменьшить его, не меняя сумму цифр.
s-andriano вне форума Ответить с цитированием
Старый 21.02.2013, 19:14   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Старый, добрый лом :
Код:
function SumOfDigits (s : string) : Integer;
var
        i, t : Integer;

begin
        t := 0;
        for i := 1 to Length(s) do
                t := t + Ord(s[i]) - 48;

        SumOfDigits := t

end;


var
        s : string;
        i, FirstSum : Integer;

begin
        ReadLn (s);

        FirstSum := SumOfDigits(s);

        WriteLn (FirstSum);



        repeat
               i := Length(s);
               while (i >= 1) and (s[i] = '9') do begin
                       s[i] := '0';
                       Dec (i)
               end;

               if i < 1 then
                       s := '1' + s
               else
                      Inc (s[i]);
        until SumOfDigits(s) = FirstSum;

        WriteLn (s)
end.
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[pascal] Работа с комбинированным типом файлов + типизированные файлы Korres Помощь студентам 0 18.05.2012 21:16
Хождения робота по плоскости (pascal) Besidnuk Помощь студентам 0 13.12.2010 13:06
Работа с типом данных запись в Pascal JayDe23 Помощь студентам 3 18.06.2009 18:08
Киньте пример работы с типом CHAR zotox Помощь студентам 6 05.05.2009 16:37