我有一个程序必须在一个区间内打印所有整数的完美平方根。现在我想为n-root执行此操作。
这就是我所做的,但我坚持使用fmod。
#include <iostream>
#include <math.h>
using namespace std;
int nroot(int, int);
int main()
{
int p, min, max,i;
double q;
cout << "enter min and max of the interval \n";
cin >> min;
cin >> max;
cout << "\n Enter the n-th root \n";
cin >> p;
i = min;
while (i <= max)
{
if (fmod((nroot(i, p)), 1.0) == 0)
{
cout << nroot(i, p);
}
i++;
}
return 0;
}
int nroot (int i, int p){
float q;
q = (pow(i, (1.0 / p)));
return q;
}
答案 0 :(得分:2)
您可能希望以相反的方向解决这个问题。而不是获取区间中每个值的第n个根来查看第n个根是否是整数,而是取出区间边界的第n个根,并根据根进行步骤:
// Assume 'min' and 'max' set as above in your original program.
// Assume 'p' holds which root we're taking (ie. p = 3 means cube root)
int min_root = int( floor( pow( min, 1. / p ) ) );
int max_root = int( ceil ( pow( max, 1. / p ) ) );
for (int root = min_root; root <= max_root; root++)
{
int raised = int( pow( root, p ) );
if (raised >= min && raised <= max)
cout << root << endl;
}
for
循环中的附加测试用于处理min
或max
直接落在根上或仅位于根侧的情况。
您可以通过识别仅在循环边界处需要raised
来从循环中删除测试和计算。这个版本看起来稍微复杂一点,实现了这个观察:
// Assume 'min' and 'max' set as above in your original program.
// Assume 'p' holds which root we're taking (ie. p = 3 means cube root)
int min_root = int( floor( pow( min, 1. / p ) ) );
int max_root = int( ceil ( pow( max, 1. / p ) ) );
if ( int( pow( min_root, p ) ) < min )
min_root++;
if ( int( pow( max_root, p ) ) > max )
max_root--;
for (int root = min_root; root <= max_root; root++)
cout << root << endl;
如果你真的关心性能(我怀疑你不是这种情况),你可以用完全算术计算n次幂的代码替换int( pow( ..., p ) )
。但这似乎有点矫枉过正。
答案 1 :(得分:1)
浮点数的精确相等测试可能无法按预期工作。最好与一些小数字进行比较:
float t = nroot(i, p);
if (fabs(t - rintf(t)) <= 0.00000001)
{
cout << t << endl;
}
即使在这种情况下,也不能保证得到min,max和p的所有值的正确结果。一切都取决于你代表数字的这个小数字和精度。您可以考虑更长的浮动类型,如“double”和“long double”。