C sqrt == long int
C sqrt == long int
为什么如果我有以下代码:
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_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, %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
的结果是double
,double
数字在很多情况下并不精确。要用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 生成您在问题中提到的无限循环。您的所有循环都会正常结束。
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,
- 自动类型默认为 int 而不是 long
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- Visual studio 2013 和 g++ 7.1 中将 int 和 long 类型相乘时的 c++ 差异行为
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- C++ vector::size_type:有符号与无符号;int vs. long
- 错误:将"long int (*)[4]"分配给"long int [4][4]"时的类型不兼容
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 函数参数可以是char*、long或int.可能吗
- unsigned int/signed int/long-long:无法解释的输出
- 如何在C++中将二进制文件上下文转换为 int/long 值
- <int> <long> 当它们的大小相同时,将矢量转换为矢量?
- " long unsigned typedef int long ullong; "是什么意思?
- 我如何使用3个重载函数(参数的差异是int, long, float)同时只要求一个输入项
- 使用非固定整数(int, long)而不是固定大小的整数(int64_t, int32_t)有什么优势吗?