Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Операции над цифрами в числе

Автор: Lexa15 7.11.2011 16:19

Стыдно, но сама не решу, выручите пожалуйста!

Дано натуральное число n. Выяснить входит ли цифра 3 в запись числа n^2, и если нет, то поменять порядок цифр числа n на обратный, в противном случае приписать единицу в начало числа n.

Автор: Krjuger 7.11.2011 16:29

А есть наработки, или хотя бы идеи?Нужно ли использовать файлы или нет?

Автор: Lexa15 7.11.2011 16:31

Я думаю циклические алгоритмы.?Подходит?

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

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

ДАЛЬШЕ ТОЖЕ НЕ ЗНАЮ(

Автор: Krjuger 7.11.2011 16:43

Эм давайте поподробнее.Вот вы ввели число,что вам надо сделать? вам надо это число везвести в квадрат.Затем есть несколько путей:Первый, перейти к использованию символьных переменных и работать с символами, второй,остаться с числовыми переменными,а третий использовать файлы,но для данной задачи не рентабельно.Определитесь,как вы хотите,ну или как вас уже должны были научить это делать.

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

Автор: Lexa15 7.11.2011 16:47

А как лучше с числовыми или с символьными?

Добавлено через 1 мин.
А можно поугадываю?Уместным будет оператор REPEAT?)

Автор: Krjuger 7.11.2011 17:06

Принципи бер разницы, так же без разницы repeat или while.
Рассмотрим пример с числовыми переменными.

Цитата
Выяснить входит ли цифра 3 в запись
ведь не всказано с какой стороны числа начинать.
Мы начнем с конца,есть две функции Div,Mod.Div возвращает часное от деления 2 чисел. Mod возвращает остаток.
Что мы будет делать в Цикле мы будет делить на 10 до тех пор,пока часное от деления не станет равно нулю.А как же мы будет узнавать равно число 3 или нет.Мы будет брать остаток и смотреть равен ли он 3.

Автор: Lexa15 7.11.2011 17:21

А почему именно на 10?

Автор: TarasBer 7.11.2011 17:25

> Case занимаеться обработкой исключений

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

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

Для чего? Уместной будет процедура Str для перевода числа в строку. Для возведения числа в квадрат не надо ничего.
Потом можно будет перебрать символы строки через FOR (for i := 1 to Length(S) do if S[i] = '3' then...)

Автор: Lexa15 7.11.2011 17:27

"Уместной будет процедура Str для перевода числа в строку"-а как это правильно записать?

Автор: Krjuger 7.11.2011 17:39

Str(x, S) преобразует число x в строковый формат. Здесь x – любое числовое выражение, S – строковая переменная.

Автор: Lexa15 7.11.2011 18:01

Я бессовестная, догадываюсь, но можете написать полное решение написать ?

Автор: Krjuger 7.11.2011 18:03

Как вариант,но с численными переменными.


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 7.11.2011 18:09

Большое человеческое! А я сегодня проведу ночь над учебником!

Автор: Krjuger 7.11.2011 18:18

Да здесь дело не в учебнике,он вам максимум раскажет как пользоваться Div,Mod, ну и приведет пару примеров.Просто надо понять,что хотят и как это можно сделать.Сначала вы придумываете алгоритм.Потом думаете,как его можно реализовать и какими средставми языка пользоваться.Вот например,как можно перевернуть число или приписать в начало единицу? Здесь вариантов уйма.Первый, записываем число в строку,смотрим сколько символов в строке,а затем домножаем наше число на 10^(кол-о посчитанных символов).Второй, можно сделать это через сложение 2 строк,третий,можно вообще не пользоваться строковыми переменными,и сначала делить и запоминать числа в массив, а потом уже сформировать само число.Если запоминать массив во время работы того кода,что я показал,то перевернуть число и добавить единицу будет весьма просто,если последовательно все делать,то просто будет немного медленнее.Но это уже вопросы оптимизации,а это не так важно для вас щас.

Автор: TarasBer 7.11.2011 18:25

> while (n<>0) and (Flag=False) do

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


Автор: Krjuger 7.11.2011 18:42

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


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


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

Автор: TarasBer 7.11.2011 18:49

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

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