Re: задачка: A^3+B^3+C^3=D^3
- From
- Sergiy Kanilo ()
- To
- Vjacheslav Maslov ()
- Date
- 2003-03-07T20:43:32Z
- Area
- RU.ALGORITHMS
From: "Sergiy Kanilo" <skanilo@artannlabs.com>
"Vjacheslav Maslov" <Vjacheslav.Maslov@p60.f231.n5000.z2.fidonet.org> wrote
in message news:1046888490@p60.f231.n5000.z2.ftn...
> /*Доброго времени суток*/, All !
>
> Хочу предложить такую задачку: найти все натуральные числа меньшие 1000,
> которые удовлетворяют уравнению:
>
> A^3+B^3+C^3=D^3.
[skip]
> Работает, но медленно где-то 5-7 минут. Один мой знакомый утверждает, что
> придумал алгоритм решения этой задачи, который отрабатывает за 2 сек на
машине
> класса P III.
#include <math.h>
#include <stdio.h>
int main(){
int const N =1000;
int i3[N+1];
for(int i=1; i<=N; ++i) i3[i] =i*i*i;
int const M =N/pow(3.0,1.0/3.0);
int const L =N/pow(2.0,1.0/3.0);
for(int a =1; a<M; ++a){
int a3 =i3[a];
for(int b=a; b<=L; ++b){
int b3 =i3[b];
int a3_b3 =a3+b3;
int a3_b3_b3 =a3_b3+b3;
int d =b+1; // or d =b*pow(2.0,1.0/3.0)
int d3 =i3[d];
while(d3<a3_b3_b3) d3 =i3[++d]; // or bsearch in i3[b+1:2*b]
if(d>N) break;
if(d3==a3_b3_b3) printf("%i^3 + %i^3 + %i^3 = %i^3\n",a,b,b,d);
for(int c=b+1; c<N; ++c){
int a3_b3_c3 =a3_b3+i3[c];
while(d <=N && d3 < a3_b3_c3) d3 =i3[++d];
if(d>N) break;
if(d3==a3_b3_c3) printf("%i^3 + %i^3 + %i^3 = %i^3\n",a,b,c,d);
}
}
}
}
работает около 1 сек (правда на P4 1.8 :)
комментарии показывают места,
где можно еще чуть ускорить (на 10-20%)
Cheers,
Serge
--- ifmail v.2.15dev5
* Origin: Demos online service (2:5020/400)