Помощь - Поиск - Пользователи - Календарь
Полная версия: Операции над цифрами в числе
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Lexa15
Стыдно, но сама не решу, выручите пожалуйста!

Дано натуральное число n. Выяснить входит ли цифра 3 в запись числа n^2, и если нет, то поменять порядок цифр числа n на обратный, в противном случае приписать единицу в начало числа n.
Krjuger
А есть наработки, или хотя бы идеи?Нужно ли использовать файлы или нет?
Lexa15
Я думаю циклические алгоритмы.?Подходит?

Добавлено через 9 мин.
А можно взять оператор отбора.Только все равно мысли по-поводу начала есть,а дальше ступор(

VAR
a,b,c:integer;
BEGIN
writeln('Введите число n:'); readln(n);
case n of {начало оператора выбора}
НЕЗНАЮ КАК ПРАВИЛЬНО НАПИСАТЬ
else writeln('Введеное число не имеет цифры 3');
end; {конец оператора выбора}

ДАЛЬШЕ ТОЖЕ НЕ ЗНАЮ(
Krjuger
Эм давайте поподробнее.Вот вы ввели число,что вам надо сделать? вам надо это число везвести в квадрат.Затем есть несколько путей:Первый, перейти к использованию символьных переменных и работать с символами, второй,остаться с числовыми переменными,а третий использовать файлы,но для данной задачи не рентабельно.Определитесь,как вы хотите,ну или как вас уже должны были научить это делать.

Case совершенно не то,что нужно использовать,но мы до этого дойдем.Case занимаеться обработкой исключений,а не организацией циклов.Это немного другое.
Lexa15
А как лучше с числовыми или с символьными?

Добавлено через 1 мин.
А можно поугадываю?Уместным будет оператор REPEAT?)
Krjuger
Принципи бер разницы, так же без разницы repeat или while.
Рассмотрим пример с числовыми переменными.
Цитата
Выяснить входит ли цифра 3 в запись
ведь не всказано с какой стороны числа начинать.
Мы начнем с конца,есть две функции Div,Mod.Div возвращает часное от деления 2 чисел. Mod возвращает остаток.
Что мы будет делать в Цикле мы будет делить на 10 до тех пор,пока часное от деления не станет равно нулю.А как же мы будет узнавать равно число 3 или нет.Мы будет брать остаток и смотреть равен ли он 3.
Lexa15
А почему именно на 10?
TarasBer
> Case занимаеться обработкой исключений

В перлы форума.

> А можно поугадываю?Уместным будет оператор REPEAT?)

Для чего? Уместной будет процедура Str для перевода числа в строку. Для возведения числа в квадрат не надо ничего.
Потом можно будет перебрать символы строки через FOR (for i := 1 to Length(S) do if S[i] = '3' then...)
Lexa15
"Уместной будет процедура Str для перевода числа в строку"-а как это правильно записать?
Krjuger
Str(x, S) преобразует число x в строковый формат. Здесь x – любое числовое выражение, S – строковая переменная.
Lexa15
Я бессовестная, догадываюсь, но можете написать полное решение написать ?
Krjuger
Как вариант,но с численными переменными.

var
n:longint;
flag: boolean;
begin
readln(n);
n:=n*n;
writeln(n);
while (n<>0) and (Flag=False) do
begin
if (n mod 10=3) then begin
flag:=True;
end
else
begin
n:=n div 10;
writeln(n);
end;
end;
writeln(flag);
readln;
end.


Проверил пару примеров,вроде нормально,найдете ошибку скажете.В переменной флаг храниться ответ на вопрос,есть ли значение в данном числе или нет.

Осталось только сделать то,что просят,тобишь добавить единицу,или перевернуть.
Lexa15
Большое человеческое! А я сегодня проведу ночь над учебником!
Krjuger
Да здесь дело не в учебнике,он вам максимум раскажет как пользоваться Div,Mod, ну и приведет пару примеров.Просто надо понять,что хотят и как это можно сделать.Сначала вы придумываете алгоритм.Потом думаете,как его можно реализовать и какими средставми языка пользоваться.Вот например,как можно перевернуть число или приписать в начало единицу? Здесь вариантов уйма.Первый, записываем число в строку,смотрим сколько символов в строке,а затем домножаем наше число на 10^(кол-о посчитанных символов).Второй, можно сделать это через сложение 2 строк,третий,можно вообще не пользоваться строковыми переменными,и сначала делить и запоминать числа в массив, а потом уже сформировать само число.Если запоминать массив во время работы того кода,что я показал,то перевернуть число и добавить единицу будет весьма просто,если последовательно все делать,то просто будет немного медленнее.Но это уже вопросы оптимизации,а это не так важно для вас щас.
TarasBer
> while (n<>0) and (Flag=False) do

Два вопроса:
1. Зачем писать Flag=False, если правильнее писать not Flag?
2. А это уже не придирка к стилю, а всерьёз. Ты переменную Flag инициализировал? Нет? Тогда лови глюки.

Krjuger
Блин,совсем забыл,ведь и вправду без строгой инициализации нельзя гарантировать,что флаг будет инициализироваться False(((
Короче надо довабить

begin
flag:=false;
readln(n);
........


Насчет первого пункта спорить смысла нет,просто мне так непривычно.
TarasBer
> Насчет первого пункта спорить смысла нет,просто мне так непривычно.

Привыкай делать без лишних слов, а то народ не поймёт.
Писать f=false вместо not f это всё равно, что писать i+0 или i*1 вместо i
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.