Об игре
Новости
Войти
Регистрация
Рейтинг
Форум
21:05
4172
 online
Требуется авторизация
Вы не авторизованы
   Форумы-->Форум для внеигровых тем-->
1|2

АвторКто знает Паскаль?)
Задача: есть число, мы должны увеличивать это число на это же число, пока оно не станет кубом какого-либо целого числа.

Моё решение:

var a,c,k:int64;
begin
read (a);
repeat
inc (k);
c:=c+a;
if frac(Exp(Ln(c) / 3))=0.000 then begin write (k);exit;end;
until 2<>2;
end.

Увеличиваем число, увеличиваем К - счетчик, сколько раз нам придётся увеличить число. Проверяем, если дробная часть кубического корня равна нулю, то выводим счетчик и выходим из программы.

А проблема вовсе не в зацикливании, а вот в этом: на входе у нас А=125, в первом шаге цикла С становится равным 125, кубический корень из него равен пяти, а его дробная часть...
http://c2n.me/3tipFxZ

Как кубический корень равен пяти, а его дробная часть какой-то фигне?
Как это исправить?(
Всем спасибо)
Кто знает Паскаль?)
Меня с ним знакомили в 7-ом классе.
Как кубический корень равен пяти, а его дробная часть какой-то фигне?
Потому что числа записаны в памяти компа в двоичной системе, а не в десятичной.
Как это исправить?(
Округлять надо.
Кто знает Паскаль?) может Москаль?
Сравнивать вещественные числа допустимо только с некоторой точностью.

frac(Exp(Ln(c) / 3))=0.000
Замени на

frac(Exp(Ln(c) / 3))<0.0000001


И будет работать.


Но если задача про целые числа, то стоит избрать другой путь решения задачи.

Хотя бы округлять этот корень, возводить результат в третью степень и смотреть, получилось ли исходное число.

Но это костыль, лучше из свойств делимости исходить.
дробные лучше вообще не трогать, паскалей много разных, как там и сям сработает - хз. Я бы просто увеличивал число для теста, пока оно в кубе не станет больше исходного числа, стало больше - увеличиваю исходное, сверяюсь. Иду дальше.
для Balmung:
Асимптотическая сложность тогда O(n^4/3) вместо O(n), а то и больше.
Хотя такой алгоритм гарантированно сработает.
для Вавар-воин:
сложность минимальная, даю гарантию, т.к. я не буду каждый раз с нуля число считать. А вот при операциях с плавающей запятой сложность там ппц какая.
Вот прога, не стоит благодарности:
program a1;
var
a,b,c:int64;
begin
readln(a);
b:=0;
c:=a;
while true do
begin
while c>=b*b*b do
begin
if c=b*b*b then
begin
writeln(b);
writeln(c);
readln;
exit;
end;
inc(b);
end;
c:=c+a;
end;
end.

Вроде не накосячил.

И да, учите си лучше.
Учите Python , он красивый и не даст вам отстрелить себе ногу
для Вавар-воин:
Хотя да, в эту прогу надо б еще добавить проверку для действительных чисел - и b увеличивать сразу к ближайшему крайнему значению. Но и так сойдет. хз, для разных входных данных разное выходит. Но так оно прозрачно и сработает в любом паскале)
для mikki1771:
c++, c#, java, as, фреймворки майкрософтские. Самое популярное. И при желании легко перейти.
для Маг-Лесник:
для Balmung:
я паскаль почти забыл, но может добавить проверку если введенное число уже куб?
для Balmung:
Это то понятно
Но учиться программированию начиная с си , явно не стоит
А йййааааа люблю военых, красивых здоровенных............
для Balmung:
у тебя же б=0.
c:=a;
c := Abs(a);
тогда уж
для ElfRush:
она там уже есть.
выходные данные для 0:
0
0
для 1:
1
1
для 2
2
8
для 3
3
27
для 4
2
8
и т.д.

для noooooooobas:
на тот случай, если введут 0.


для Раздетая:
так прост:
Сигизмунд Дийкстра — бывший шеф реданской разведки. Именуется графом, дабы не вызывать у окружения подозрений и недоброжелательности. Описывается как невероятно огромный человек с живейшим умом, не под стать внешности, совсем не похожий на шпиона. ;)
для ElfRush:
тогда уж надо вообще отрицательные учесть. У мну не учтено, да.
для Balmung:
а отрицательные кто будет учитывать? али -27 не куб?
для ElfRush:
там 2 условных костыля добавить в самом начале и в самом конце - и они учтутся.
1|2
К списку тем
2007-2025, онлайн игры HeroesWM