我不知道爲什麼,如果我有以下代碼:ç開方==長詮釋
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'的情況下終止。請給我們一個完整的例子,我們可以編譯和運行以展示問題以及您所在的編譯器和體系結構。 –