我不知道为什么,如果我有以下代码:ç开方==长诠释
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_cats
和height_tree
这(number_helper_cats +1)^height_tree = height_cat
和number_helper_cats^height_tree = number_worker_cats
其中height_cat
和number_worker_cats
是integers
。
例如,如果height_cat = 216
和number_worker_cats = 125
,代码将停止number_helper_cats = 5
和height_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.但第一个代码运行良好,第二个代码永远循环。 pow are precise我的意思是6^3 = 216和5^3 = 125对不对? :p
至少告诉我们哪个回路是无限的。我敢打赌,一旦你明白了这一点,你就会知道答案。 – MSalters
@MSalters看起来很清楚(我认为无论如何),外层循环是永远的循环:一旦你打到一定数量的帮猫,内层循环甚至不会迭代,从而防止设置标志。 –
代码(以及我不得不添加一堆样板来编译它)在g ++ 4.5和没有优化,'-O2','-O3',甚至是-O3 -ffast-math'的情况下终止。请给我们一个完整的例子,我们可以编译和运行以展示问题以及您所在的编译器和体系结构。 –