C sqrt == long int

C sqrt == long int

本文关键字:int long sqrt      更新时间:2023-10-16
我不知道

为什么如果我有以下代码:

int main() {
    long int height_cat, number_worker_cats, number_helper_cats, height_tree;
    bool flag;
    scanf("%ld%ld", &height_cat, &number_worker_cats);
    for (number_helper_cats = 1; ; ++number_helper_cats) {
        for (height_tree = 1; (long int)pow(number_helper_cats + 1, height_tree) <= height_cat; ++height_tree) {
            if ((long int)(pow(number_helper_cats + 1, height_tree) - height_cat) == 0 && (long int)(pow(number_helper_cats, height_tree) - number_worker_cats) == 0) {
                flag = true;
                break;
            }
        }
        if (flag) {
            break;
        }
    }
 printf("%ld, %ldn", number_helper_cats, height_tree);
}

我正在寻找number_helper_catsheight_tree哪些(number_helper_cats +1)^height_tree = height_catnumber_helper_cats^height_tree = number_worker_cats height_catnumber_worker_cats在哪里integers

例如,如果height_cat = 216number_worker_cats = 125,则代码将在number_helper_cats = 5height_tree = 3停止,因为(5+1)^3 = 2165^3 = 125

但是如果我有以下代码它不起作用,永远循环,为什么?

int main() {
    long int height_cat, number_worker_cats, number_helper_cats, height_tree;
    bool flag;
    scanf("%ld%ld", &height_cat, &number_worker_cats);
    for (number_helper_cats = 1; ; ++number_helper_cats) {
        for (height_tree = 1; pow(number_helper_cats + 1, height_tree) <= height_cat; ++height_tree) {
            if ((long int)(pow(number_helper_cats + 1, height_tree)) == height_cat &&
                        (long int)(pow(number_helper_cats, height_tree)) == number_worker_cats) {
                flag = true;
                break;
            }
        }
        if (flag) {
            break;
        }
    }
printf("%ld, %ldn", number_helper_cats, height_tree);
}

一切都是long int的,测试用例的每个height_cat和number_worker_cats对于操作都是正确的,另一个示例height_cat = 5764801,number_worker_cats = 1679616,number_helper_cats = 6 和 height_tree = 8,因为 (6 + 1)^8 = 5764801,6^8 = 1679616。但同样,第一个代码运行良好,第二个代码永远循环。pow 是精确的我的意思是 6^3 = 216 和 5^3 = 125 对吧?:p

pow的结果

doubledouble数字在很多情况下并不精确。要用double测试相等性,一个常用的方法是

if (abs(pow(number_helper_cats + 1, height_tree) - height_cat)) < 0.001); // 0.001 is an arbitrary small number
{
     ...
}

A和测试<=,你应该使用pow(number_helper_cats + 1, height_tree) <= height_cat + 0.001

但是,我必须提到,您的代码无法使用我的 gcc 4.7.2 生成您在问题中提到的无限循环。您的所有循环都会正常结束。

相关文章: