• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Улучшение решения задачи про кубы

Asya_inter

Новые
Регистрация
12 Янв 2015
Сообщения
71
Реакции
0
Баллы
0
Улучшение решения задачи про кубы

Подскажите, почему задача после кё запуска долго не завершается, хотя и ответ вывела? А ещё, как улучшить можно? Нужно узнать, можно ли данное число представить в виде суммы кубов трех натуральных чисел.
Код:
program z1;
var m2, i,j,k:integer;
m,m1,s:real;
begin
writeln('VVedite chislo:');
readln(m1);
s:=3;
m:=exp(ln(m1)*s);
m2:=round(m);
for i:=1 to  m2 do 
for j:=1 to  m2 do
for k:=1 to  m2 do
if i*i*i+j*j*j+k*k*k=m1 then begin
writeln( i,' ', j,' ', k);
end;
writeln('nelzia');
end.
 
Вот что получилось, но можно ли лучше?
program z1;{Нужно узнать, можно ли данное число представить в виде суммы кубов трех натуральных чисел.}

var
m2, i, j, k: integer;
m, m1, s: real;
ok: boolean;

begin
writeln('VVedite chislo:');
readln(m1);
ok:=true;
s := 1/3;
m := exp(ln(m1/3) * s);
m2 := round(m);
for i := 1 to m2 do
for j := 1 to m2 do
for k := 1 to m2 do
if i * i * i + j * j * j + k * k * k = m1 then begin
writeln(m1,'=' , i, '^3+', j, '^3+', k,'^3');
ok:=false;
end;
if ok then begin
write('nelzia');
end;
end.
 
У меня так получилось :

uses crt;
var i,j,t,x,y,z,n,m,p:Longint;
m1:Extended;
begin
ClrScr;
p:=0;
Write('Cislo = '); Readln(n);
m1:=exp(ln(n)/3);
m:=Trunc(m1);
for i:=1 to m do
begin
x:=i*i*i;
if p<>0
then Break
else
for j:=1 to m do
begin
y:=j*j*j;
if p<>0
then Break
else
for t:=1 to m do
begin
z:=t*t*t;
if (x+y+z)=n then
begin
Writeln(i,' ',j,' ',t);
Inc(p);
Break;
end;
end;
end;
end;
if p=0 then Writeln('Nelzja');
ReadKey;
end.
 
Евгений, спасибо - всё отлично работает!
 
Вот что получилось, но можно ли лучше?
Уж не знаю, лучше или нет, но мне нравится больше. По крайней мере, удалось обойтись без вещественных форматов.
Код:
Var
 M,a,b,c,d:Integer;
 T:boolean;

Begin
 Write('M = ');
 Readln(M);
 a:=0;
 repeat
  Inc(a);
  b:=0;
  repeat
   Inc(b);
   c:=0;
   repeat
    Inc(c);
    d:=M-a*a*a-b*b*b-c*c*c;
    T:=(d=0);
   until T or (d<0);
  until T or (b*b*b+a*a*a>M-1);
 until T or (a*a*a>M-2);
 if T then
  writeln('Yes: ',M,' = ',a,'^3 + ',b,'^3 + ',c,'^3')
 else
  writeln('No');
 Readln
End.
 
Vladimir_S, большое спасибо! Очень даже понятно!
 
Назад
Сверху