Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Pascal

Выпуск № 343
от 13.04.2007, 09:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 240, Экспертов: 66
В номере:Вопросов: 3, Ответов: 8


Вопрос № 81444: Здравствуйте! У меня задача: Написать на Паскале программу, которая будет считать сумму цифр числа. Если подсказка, что здесь надо как-то использовать операторы DIV и MOD. Помогите мне пожалуйста решить эту задачу! Спасибо!...
Вопрос № 81457: Здравствуйте! Никак не могу придумать алгоритм. Нужно извлечь корень n-й степени из числа при использовании длинной арифметики. Очень нужно!...
Вопрос № 81468: Доброго вечера уважаемые эксперты. Как сделать на пакале сделать так, чтобы клоун жанглировал кругами? Клоун у меня есть....

Вопрос № 81.444
Здравствуйте!
У меня задача:
Написать на Паскале программу, которая будет считать сумму цифр числа. Если подсказка, что здесь надо как-то использовать операторы DIV и MOD.
Помогите мне пожалуйста решить эту задачу!
Спасибо!
Отправлен: 07.04.2007, 15:05
Вопрос задал: Красильников И.П. (статус: 10-ый класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Решетник Д
Здравствуйте, Красильников И.П.!
Решение не напишу. А вот алгоритм...
Х = число.
У - результат

У = 0
пока Х > = 1 {был допущен маленький недочет - пропущен знак равно. -~= Gh0stik =~-}
{
У = У + (остаток_от_деления(Х / 10))
Х = целая_часть(Х / 10)
}
Вроде, так...
---------
Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: Студент)
Ответ отправлен: 07.04.2007, 15:17
Оценка за ответ: 5
Комментарий оценки:
Спасибо!

Отвечает: Verena
Здравствуйте, Красильников И.П.!

В предыдущем алгоритме есть неточность: если первая цифра числа 1, то цикл прервётся, а эта единица не добавится. Надо так:

y:=0;
while (x>0) do
begin
y:= y+x mod 10;
x:= x div 10;
end;
---------
Эта история - не для истории, понимаешь?
Ответ отправила: Verena (статус: 8-ой класс)
Ответ отправлен: 07.04.2007, 15:38
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо, всё получилось!

Отвечает: Menand
Здравствуйте, Красильников И.П.!

Если брать не гигантское целое то:

var summ, chisl :longint;

begin

writeln('Vvedite chislo');
readln(chisl);
while(chisl>0) do
begin
summ:=summ+chisl mod 10;
chisl:=chisl div 10;
end;
writeln('Itogo ', summ);
readln;

end.

если нада совсем большое то исползуйте стринг и посимвольно преобразуйте в цифру, если число отрицательное - можно домножить на -1 (если нада считать сумму отриц. чисел)
Ответ отправил: Menand (статус: 3-ий класс)
Ответ отправлен: 07.04.2007, 15:41
Оценка за ответ: 5
Комментарий оценки:
Спасибо! Кстати, ещё один вариант этой программы есть в мини-форуме.
Удачи!

Отвечает: Шарков Сегей Николаевич
Здравствуйте, Красильников И.П.!
Решил задачу для максимум 10-ых чисел

Приложение:

Ответ отправил: Шарков Сегей Николаевич (статус: 1-ый класс)
Ответ отправлен: 08.04.2007, 15:48
Оценка за ответ: 5
Комментарий оценки:
Спасибо!


Вопрос № 81.457
Здравствуйте!
Никак не могу придумать алгоритм. Нужно извлечь корень n-й степени из числа при использовании длинной арифметики. Очень нужно!
Отправлен: 07.04.2007, 17:28
Вопрос задал: Troyan (статус: 9-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Bingo
Здравствуйте, Troyan!
Мои соображения по поводу Вашего вопроса:
Необходимо это большое число представить в виде произведения простых множителей:2,3,5,7 и.т.д...
Для этого завести массив такого типа:
--
const max=100000;
type pr=record
zn,k:longint;
end;
var a:array[1..max] of pr;
--
Теперь поясняю: в массиве a[i].zn будут храниться значения всех простых множителей,на которые мы делили число, а a[i].K - сколько раз они встречаются(получается, что это степень a[i].zn) . Затем пока число будет делится нацело на один из простых множителей, мы увеличиваем счетчик и делим это число на простой множитель. Если же нет, то перейдем к следующk 7;му простому множителю. Для наглядности возьмем число 216. После такой процедуры получится запись вида 2^3*3^3. А потом сравним, если у каждого из a[i].zn показатель степени(a[i].k)div n>0(степе ;ни корня), тогда число выходит из-под корня. Получится, что корень 3-й степени из 216 - это произведение 2*3=6. Тоже самое будет и с числом 1728=2^6*3^3, а корень 3-й степени из этого числа равняе тся 2^2*3=12. Но мы имеем дело с длинной арифметикой, поэтому для этого необходимо знать, как реализовать ДЕЛЕНИЕ в длинной арифметике (это уже отдельный вопрос). Короче, прид 77;тся хорошенько повозиться с этим делом. Надеюсь, что Вы уловили мою мысль =)
Удачи"!
---------
C темным пивом в светлое будущее!
Ответ отправил: Bingo (статус: 3-ий класс)
Ответ отправлен: 07.04.2007, 18:48
Оценка за ответ: 5
Комментарий оценки:
Спасибо, мысль уловил! Все простейшие и неочень простейшие операции уже реализованы, осталось сделать корень и степень. Спасибо за мысль!

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Troyan!
Мысль Bingo хороша, пока вы не встретитесь с простым числом, которое не укладывается в 32(64) бита.
Я предлагаю приближенное значение вычислять через стандартный тип с плавающей запятой, а дальше уже работать по алгоритму Ньютона. Вообще, вбиваете это словосочетание в любой поисковик и — 9 из 10 ссылок про то, что надо, причем материал на разных сайтах часто разный :-) Обычно, метод описан для квадратного корня, но как привести его для n-го, вы сами догадаетесь. Да и по скорости может выйти быстрее, чем разложение на простые.
---------
Не узнаешь - не попробуешь.
Ответ отправил: Сухомлин Кирилл Владимирович (статус: Специалист)
Ответ отправлен: 08.04.2007, 04:38
Оценка за ответ: 5
Комментарий оценки:
Спасибо, буду разбираться!

Отвечает: Menand
Здравствуйте, Troyan! Нашёл таки письмо - отвечаю по нормальному:

Здравствуйте, Troyan!

var chisl,low,hi:real;
step,i: integer;

function fstep ( chisl1 : real; step1 : integer):real;
var tmp:real;
i:byte;
begin
tmp:=chisl1;
for i:=1 to step1-1 do tmp:=tmp*chisl1;
fstep:=tmp;
end;

begin
writeln('Chisl?');
readln(chisl);
writeln('Step?');
readln(step);
low:=0;
hi:=chisl/2;
for i:=1 to 60 do
begin
if fstep((hi+low)/2,step)>chisl then hi:=(hi+low)/2 else low:=(low+hi)/2;
end;

chisl:=(low+hi)/2;
writeln('Koren ',chisl:10:5);
readln;

end.
Ответ отправил: Menand (статус: 3-ий класс)
Ответ отправлен: 09.04.2007, 11:08
Оценка за ответ: 4
Комментарий оценки:
Насколько я понимаю, это только алгоритм. Спасибо. Но что значат эти 60 из "For i:=1 to 60". И вообще не могли бы вы поподробнее описать этот алгоритм, т.к. мне его еще переделывать?


Вопрос № 81.468
Доброго вечера уважаемые эксперты. Как сделать на пакале сделать так, чтобы клоун жанглировал кругами? Клоун у меня есть.
Отправлен: 07.04.2007, 19:31
Вопрос задал: Басырова Азалия Ришатовна (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Verena
Здравствуйте, Басырова Азалия Ришатовна!

Раз сама картинка у Вас есть, значит, я так понимаю, работать с графикой Вы умеете. Если затруднение в создании анимации, то делается это так: открывается цикл (бесконечный или до какого-нибудь числа повторений), круг (Circle (x, y, R), где х и у - координаты центра, R - радиус) выводится в некоторых координатах, после ставится задержка (процедура delay (задержка_в_миллисекундах)), переменыые, отвечающие за координаты круга меняются (например, х и у можно изменять приблизительно по линии окружности, или ещё по какой-нибудь формуле - самое простое добавлять к координатам какое-то фиксированние значение, домноженное на коэффициент, принимающий значения 1 и -1, а на определённых итерациях коэффициент менять, чтобы координаты то увеличивались, то уменьшались), предыдущий круг стирается (эта область заполняется цветом фона или картинка-фон выводится заново) и на новой итерации круг будет выводиться со смещением. Благодаря задержке получается анимация - движение круга, т.е. жонглир ование.
---------
Эта история - не для истории, понимаешь?
Ответ отправила: Verena (статус: 8-ой класс)
Ответ отправлен: 07.04.2007, 19:57


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.48 от 12.04.2007
Яндекс Rambler's Top100

В избранное