用于查找数字的第n个根的函数

时间:2017-03-06 19:43:53

标签: c

在进行数学运算时,我需要计算一个被称为完美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等,它给出了垃圾值作为答案。这个程序的正确编码应该是什么?

4 个答案:

答案 0 :(得分:3)

这是因为set未初始化,即您从未设置它。你这样做:

set==i;
return set;

seti进行比较(无效)。然后你没有初始化它。做

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

然后,该程序对包围结果的值使用整数运算,以查看它们是否正确加电。不需要详尽的循环。

程序运行参数为numbern-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