在进行数学运算时,我需要计算一个被称为完美n次幂的数的第n个根。但是为了找到我使用以下代码的第n个根
int i, j, set;
for (i = 1; i <= number; i++)
{
j = pow(i, exponent);
if (j == number)
{
set == i;
return set;
}
}
在函数Root(int number,int exponent)中。
现在要得到答案,我需要抓住&#39; i&#39;当下&#39; j ==数字&#39;发生了,我需要返回这个&#39; i&#39;作为返回值,以便我可以使用它。 它可以工作,但对于某些值,如25,100等,它给出了垃圾值作为答案。这个程序的正确编码应该是什么?
答案 0 :(得分:3)
这是因为set
未初始化,即您从未设置它。你这样做:
set==i;
return set;
将set
与i
进行比较(无效)。然后你没有初始化它。做
return i;
因为您无论如何都不使用set
。
答案 1 :(得分:2)
你有一个错字
set == i
可能应该是
set = i
不要忽略编译器警告,如果没有它们,请激活它们。此外,尝试使用最新的编译器,以获得最新的诊断功能。
答案 2 :(得分:2)
j = round(pow(i, e))
会更加稳定;将浮点截断到下一个较低的整数会夸大微小错误,如果它们恰好在错误的方向上。
但是你可以通过用反指数估计根来做得更好:
int root = round(pow(number, 1.0/e));
然后,检查root
e
number
的力量{{1}}是否为{{1}}。
答案 3 :(得分:0)
函数pow为权力采用double
参数,对于第n个根,它将为1.0 / n
。
然后,该程序对包围结果的值使用整数运算,以查看它们是否正确加电。不需要详尽的循环。
程序运行参数为number
和n-th root
。
#include <stdio.h>
#include <math.h>
unsigned powN (unsigned num, unsigned power)
{
unsigned prod = 1;
while (power) {
if (power & 1)
prod *= num;
num *= num;
power >>= 1;
}
return prod;
}
int main(int argc, char *argv[])
{
unsigned number, root, answer, test;
if(argc < 3) {
return 0;
}
if(sscanf(argv[1], "%u", &number) != 1) {
return 0;
}
if(sscanf(argv[2], "%u", &root) != 1) {
return 0;
}
answer = (unsigned)pow(number, 1.0 / root);
// check this value
test = powN(answer, root);
if(test == number) {
printf("%u**%u = %u\n", answer, root, number);
return 0;
}
// check the value above
test = powN(answer+1, root);
if(test == number) {
printf("%u**%u = %u\n", answer+1, root, number);
return 0;
}
// check the value below
if (answer > 1) {
test = powN(answer-1, root);
if(test == number) {
printf("The %u**%u = %u\n", answer-1, root, number);
return 0;
}
}
printf("No exact %u-th root of %u\n", root, number);
return 0;
}
样品运行:
test 49 2 7**2 = 49 test 50 4 No exact 4-th root of 50 test 64 3 4**3 = 64 test 16807 5 7**5 = 16807