所以,这是我的要求。如果二次方程式有两个根(int和浮点数),我想只取整数值以进行进一步处理。我不知道是怎么做的。谁能告诉我。 (Java会更好)。
答案 0 :(得分:0)
[我不经常使用Java。这是一个使用C的解决方案。由于仅使用基本概念,因此Java从业者应该能够轻松地对其进行翻译。]
在网络上搜索“立方和”会显示this page,它告诉我们 k 的 k 3 的总和1到 n 是 n 2 •( n +1) 2 / 4
这是一个四次方程,已知闭式解,但是对于正数 n , n 2 •( n +1) 2 / 4在 n 4 / 4和( n +1) 4 / 4。然后,如果 m 是第一个 n 个立方体的总和,则 n = floor((4• m ) 1/4 )。因此,如果我们有一个pow
实现,并且使用最近舍入法进行了舍入(计算结果是最接近数学结果的两个可表示值之一),则可以找到 n 与floor(pow(4*m, .25))
。如果pow
未如实四舍五入,则round(pow(4*m, .25))
将在pow
返回合理结果而没有太多错误的域上服务。 (round
之所以有效,是因为(4• m ) 1/4 永远不会超过 n ½以上。尽管{ {3}},多余的部分是单调的。)
因此,如果 m 是第一个 n 个立方体的总和,则 n 是round(pow(4*m, .25))
的结果。因此,我们可以计算 n 的值,然后将第一个 n 个立方的总和计算为n*n*(n+1)*(n+1)/4
并测试其是否等于 m 。如果可以,我们找到了解决方案并返回。如果不是,则 m 不是多维数据集的总和,我们返回−1:
#include <math.h>
#include <stdio.h>
static double findNb(double m)
{
double n = round(pow(4*m, .25));
double sum = n * n * (n+1) * (n+1) / 4;
return m == sum ? n : -1;
}
static void Test(double m)
{
printf("findNb(%.99g) -> %.99g.\n", m, findNb(m));
}
int main(void)
{
Test(0);
Test(1);
Test(2);
Test(8);
Test(9);
Test(10);
Test(250500249999.);
Test(250500250000.);
Test(250500250001.);
}
输出:
findNb(0) -> 0. findNb(1) -> 1. findNb(2) -> -1. findNb(8) -> -1. findNb(9) -> 2. findNb(10) -> -1. findNb(250500249999) -> -1. findNb(250500250000) -> 1000. findNb(250500250001) -> -1.
当然,一旦 m 大于double
中可以表示的范围,浮点精度的限制将导致此代码失败。
答案 1 :(得分:0)
使用基本二次方程式求根。
将根设置为不同的值(均为双精度)
使用1的模数(%),并将值转换为双精度。如果计算的double是!= 0,则它不是int。