Вопрос № 81444: Здравствуйте!
У меня задача:
Написать на Паскале программу, которая будет считать сумму цифр числа. Если подсказка, что здесь надо как-то использовать операторы DIV и MOD.
Помогите мне пожалуйста решить эту задачу!
Спасибо!...Вопрос № 81457: Здравствуйте!
Никак не могу придумать алгоритм. Нужно извлечь корень n-й степени из числа при использовании длинной арифметики. Очень нужно!...Вопрос № 81468: Доброго вечера уважаемые эксперты. Как сделать на пакале сделать так, чтобы клоун жанглировал кругами? Клоун у меня есть....
Вопрос № 81.444
Здравствуйте!
У меня задача:
Написать на Паскале программу, которая будет считать сумму цифр числа. Если подсказка, что здесь надо как-то использовать операторы DIV и MOD.
Помогите мне пожалуйста решить эту задачу!
Спасибо!
Отвечает: Решетник Д
Здравствуйте, Красильников И.П.!
Решение не напишу. А вот алгоритм...
Х = число.
У - результат
У = 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;
Ответ отправил: Menand (статус: 3-ий класс)
Ответ отправлен: 09.04.2007, 11:08 Оценка за ответ: 4 Комментарий оценки: Насколько я понимаю, это только алгоритм. Спасибо. Но что значат эти 60 из "For i:=1 to 60". И вообще не могли бы вы поподробнее описать этот алгоритм, т.к. мне его еще переделывать?
Вопрос № 81.468
Доброго вечера уважаемые эксперты. Как сделать на пакале сделать так, чтобы клоун жанглировал кругами? Клоун у меня есть.
Раз сама картинка у Вас есть, значит, я так понимаю, работать с графикой Вы умеете. Если затруднение в создании анимации, то делается это так: открывается цикл (бесконечный или до какого-нибудь числа повторений), круг (Circle (x, y, R), где х и у - координаты центра, R - радиус) выводится в некоторых координатах, после ставится задержка (процедура delay (задержка_в_миллисекундах)), переменыые, отвечающие за координаты круга меняются (например, х и у можно изменять приблизительно по линии окружности, или ещё
по какой-нибудь формуле - самое простое добавлять к координатам какое-то фиксированние значение, домноженное на коэффициент, принимающий значения 1 и -1, а на определённых итерациях коэффициент менять, чтобы координаты то увеличивались, то уменьшались), предыдущий круг стирается (эта область заполняется цветом фона или картинка-фон выводится заново) и на новой итерации круг будет выводиться со смещением. Благодаря задержке получается анимация - движение круга, т.е. жонглир
ование.
--------- Эта история - не для истории, понимаешь?
Ответ отправила: Verena (статус: 8-ой класс)
Ответ отправлен: 07.04.2007, 19:57