Найти все целые неотрицательные корни уравнения - C (СИ)
Формулировка задачи:
Привет. Делая очередную лабу столкнулся с такой проблемой, преподаватель объяснить не хочет, говорит мол делай сам.
Задача такова, найти все целые неотрицательные корни уравнения x^3 + y^3 = 729. Ниже мой код, компилятор Visual Studio 2010.
Итак, меня интересует вопрос, почему программа выдаёт мне только решение x = 0 y = 9, но не выдаёт так-же x = 9 y = 0. Пробовал, к примеру, поменять формулу на x^3 + y^3 = 8, всё прекрасно работает, выдаёт корни 0 2 и 2 0. Объясните пожалуйста почему такая вот штука происходит.
#include "stdafx.h"
#include "math.h"
#include "locale.h"
double k,x;
int y;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"russian");
k = pow (729,1.0/3);
int z = (double)k+1;
puts("Целыми неотрицательными корнями уравнения x^3+y^3=729 являются числа:");
for (y=0; y<=z; y++)
{
x = pow((729-y*y*y),1.0/3);
if (int(x) == x)
{
printf(" x=%d y=%d \n",int(x),y);
}
}
return 0;
}Решение задачи: «Найти все целые неотрицательные корни уравнения»
textual
Листинг программы
//---------------------------------------------------------------------------
#include <iostream>
#include <cmath>
using namespace std;
const double e= 10e-12;
double k,x;
int y=0;
//---------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
double d=729;
k = pow (d,1.0/3);
int z = (double)k+1;
cout<<"Целыми неотрицательными корнями уравнения x^3+y^3= "<<d<<" являются числа:"<<endl;
for (y=0; y<=z; y++)
{
x = pow((d-y*y*y),1.0/3.0);
if( fabs(ceil(x)-x) < e )
cout<<"x= "<<ceil(x)<<" "<<"y= "<<y<<endl;
}
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Объяснение кода листинга программы
В этом коде на языке C выполняется поиск всех целых неотрицательных корней уравнения x^3 + y^3 = d, где d — это число 729.
- В первой строке объявляются переменные: — k — для хранения корня, равного 729^(1/3), то есть 9 — x — для промежуточных вычислений — y — для контроля цикла — d — для хранения значения 729
- Далее, в цикле, перебираются все значения y от 0 до (double)k+1 (то есть от 0 до 10).
- Внутри цикла вычисляется значение x, как корень кубический из (d — yyy) с точностью до 12-го знака после запятой.
- Затем проверяется, является ли округленное значение x целым числом (если abs(ceil(x)-x) < e).
- Если округленное значение x является целым числом, то выводятся значения x и y.
- В конце программы вызывается функция system(
pause), чтобы программа не закрылась сразу после вывода результатов, и возвращается 0.