Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Igor Krassikov                       2:463/59.1     06 Mar 2003  11:41:00
 To : Vjacheslav Maslov
 Subject : Re: задачка: A^3+B^3+C^3=D^3
 -------------------------------------------------------------------------------- 
 
 06 Mar 03, Vjacheslav Maslov ==. All:
 
  VM> 2. Затем тройной цикл:
  VM>     for a:=1 to N do
  VM>         for b:=1 to N do
  VM>             for c:=1 to N do begin
  VM>                 if Search(Cubes[a]+Cubes[b]+Cubes[c]) then //найдено
     Как минимум, лучше циклы такие: (для ясности я вычисляю кубы на месте)
     for(a = 1; a <= 1000; +=a)
     {
         int a3 = a*a*a;
         for(b = a; b < 1000; ++b)
         {
             int b3 = b*b*b;
             if (a3 +b3 > 1000000000) break;
             for(c = b; c < 1000; ++c)
             {
                 int c3 = c*c*c;
                 if (a3+b3+c3 > 1000000000) break;
 
                 ... собственно проверки ...
 
     Да и проверять, исходя из a <= b <= c, надо только числа а не более 694...
 
     Код ниже на Intel Pentium III 32/256Kb Cache 733.3MHz находит все решения за
 29 секунд. Использован алгоритм поиска целочисленного кубического корня.
 #include <stdio.h>
 
 inline int Cube(int x) { return x*x*x; };
 inline int icbrt(unsigned x)
 {
     int s = 30;
     unsigned y = 0, b;
     while(s >= 0)
     {
         y *= 2;
         b = (3*y*(y+1)+1) << s;
         s -= 3;
         if (x >= b)
         {
             x -= b;
             ++y;
         }
     }
     return y;
 }
 
 #define N 694  // ceil(1000/exp(log(1000)/3))
 
 void main()
 {
     int a,b,c,d;
     for(a = 1; a <= N; ++a)
     {
         int a3 = Cube(a);
         for(b = a; b <= 1000; ++b)
         {
             int b3 = Cube(b);
             if (a3 + b3 > 1000000000) break;
             for(c = b; c <= 1000; ++c)
             {
                 int sum = a3+b3+Cube(c);
                 if (sum > 1000000000) break;
 
                 d = icbrt(sum);
                 if (Cube(d) == sum) printf("%d %d %d %d\n",a,b,c,d);
             }
         }
     }
 }
 
    Всего при таком раскладе проверяется 118807221 тройка, т.е. меньше 12% от
 твоего расклада.
 
     Hо! это не более чем улучшение предложенного тобой метода "в лоб" (впрочем, 
 на порядок...) - наверное, возможны и другие, более хитрые алгоритмы.
 
 Best regards.
         Igor
 ---  That's all
  * Origin: KIV ~&C[++!]o (FidoNet 2:463/59.1)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 задачка: A^3+B^3+C^3=D^3   Vjacheslav Maslov   06 Mar 2003 01:15:54 
 Re: задачка: A^3+B^3+C^3=D^3   Vadim Miller   06 Mar 2003 00:59:13 
 Re: задачка: A^3+B^3+C^3=D^3   Igor Krassikov   06 Mar 2003 11:41:00 
 задачка: A^3+B^3+C^3=D^3   Kluchnikov Eugene   06 Mar 2003 13:52:14 
 Re: задачка: A^3+B^3+C^3=D^3   Soldatenkov Mitea   07 Mar 2003 03:08:44 
 Re: задачка: A^3+B^3+C^3=D^3   Oleg I. Khovayko   07 Mar 2003 21:29:53 
 Re: задачка: A^3+B^3+C^3=D^3   Igor Krassikov   07 Mar 2003 21:36:00 
 Re: задачка: A^3+B^3+C^3=D^3   Sergiy Kanilo   07 Mar 2003 21:43:32 
 Re: задачка: A^3+B^3+C^3=D^3   Dmitry Lipovoi   09 Mar 2003 10:57:46 
 Re: задачка: A^3+B^3+C^3=D^3   Sergiy Kanilo   11 Mar 2003 07:48:21 
 задачка: A^3+B^3+C^3=D^3   Sasha Pelepeichenko   07 Mar 2003 15:09:46 
 задачка: A^3+B^3+C^3=D^3   Vjacheslav Maslov   09 Mar 2003 01:05:22 
 задачка: A^3+B^3+C^3=D^3   Sasha Pelepeichenko   11 Mar 2003 01:14:26 
 задачка: A^3+B^3+C^3=D^3   Dima Danilov   11 Mar 2003 22:29:06 
 Re: задачка: A^3+B^3+C^3=D^3   Sergey Andrianov   07 Mar 2003 23:54:52 
Архивное /ru.algorithms/22893e67262d.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional