Автор | Кто знает Паскаль?) |
Задача: есть число, мы должны увеличивать это число на это же число, пока оно не станет кубом какого-либо целого числа.
Моё решение:
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 условных костыля добавить в самом начале и в самом конце - и они учтутся. |