-2

次のコードがあるのはなぜかわかりません。

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, %ld\n", number_helper_cats, height_tree);
}

私は、どこで、どこで、どこにいるのかを探しnumber_helper_catsheight_treeいます。(number_helper_cats +1)^height_tree = height_catnumber_helper_cats^height_tree = number_worker_catsheight_catnumber_worker_catsintegers

たとえば、height_cat = 216との場合number_worker_cats = 125、コードはnumber_helper_cats = 5height_tree = 3以降(5+1)^3 = 216で停止し5^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, %ld\n", 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だからです。この場合も、最初のコードは正常に実行され、2番目のコードは永久にループします。捕虜は正確です。つまり、6 ^ 3=216と5^3 = 125ですよね?:p

4

1 に答える 1

1

の結果はpowでありdoubledouble多くの場合、数値は正確ではありません。との等価性をテストするdoubleには、一般的な方法は次のようになります。

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

および のテストには<=、 を使用する必要がありますpow(number_helper_cats + 1, height_tree) <= height_cat + 0.001

ただし、私の gcc 4.7.2 では、質問で言及した無限ループをコードで生成できないことに言及する必要があります。すべてのループは正常に終了します。

于 2012-11-15T15:48:47.593 に答える