当我运行我的代码时,对于Y,我始终得到值-2147483648,无论y被输入到我的等式中是什么值。
这是我的代码。
#define MAX 1000
#define EQ(y) ((2*(pow(y, 4)))+1)
int check(int value);
int main()
{
int i, y, x;
for(y = 1; y < MAX; y++)
{
i = EQ(y);
if(check(i))
printf("combination found: x = %d, y = %d", sqrt(i), y);
}
}
int check(int value)
{
int x = sqrt(value);
if ((x*x) == value)
return 1;
else
{
return 0;
}
}
在查看我的代码之后,我意识到我的问题是我的&#34; int x = sqrt(value)&#34;。除了&#34;值&#34;的问题变量是一个int,当然,由于检查的目的是评估(2 *(pow(y,4)))+ 1)是否返回一个完美的整个正方形,因此仍然会返回一个虚假值对于y的任何给定值,由于检查中的变量x(double值)是数据类型integer,这是不可能的。
更新:我重写了我的代码,如下所示。我仍然没有得到任何正确的回报
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
/*
* the solution I implemented basically involved dropping x from the equation, solving for y, checking to see if it has a
* perfect square root. if it does, then x = the squareroot of y in the function EQ.
* original problem: for equation x^2 - 2y^4 + 1 = 0, find all possible solutions up to arbitrary maximum
*/
#define MAX 100000
#define EQ(g) (((pow(g, 4.0)))+1)
int check(double value);
int main()
{
int y, x;
double i;
for(y = 1; y < MAX; y++)
{
i = EQ(y);
if(x = check(i) > 0)
printf("combination found: x = %d, y = %d\n", y, x);
}
}
int check(double value)
{
double x = sqrt(value);
int n = (int) x;
printf("%d\n%f\n%f\n", n*n, value, x);
if (n*n == value)
return n*n;
else
return 0;
}
阅读评论是我的代码的顶部,这个选择的目的应该非常明显。
答案 0 :(得分:2)
pow()
返回double,您使用整数i
来存储返回值。
由于表达式评估期间的类型提升,表达式为:
((2*(pow(y, 4)))+1)
将给出一个double值,你将它存储在整数类型中,这将产生意想不到的结果。
答案 1 :(得分:2)
您没有double pow(double, double);
的原型,因此编译器会隐式假设其签名为int pow(int, int);
。不好!</ p>
解决方法是#include
.c
文件顶部的相应标题。
#include <math.h>
确保启用警告,如果已经启用警告,请注意它们!您的编译器应警告您缺少原型。 (它还应该为printf
吐出类似的警告。)
答案 2 :(得分:0)
这是pow
:
double pow(double x, double y)
这意味着它在double
中运作。通过使用int
代替,变量y
溢出。
答案 3 :(得分:0)
参考您更新的问题,这一行:
if(x = check(i) > 0)
需要括起来:
if((x = check(i)) > 0)