gpt4 book ai didi

C++ 检查 double 是否为整数在某些情况下不起作用

转载 作者:行者123 更新时间:2023-11-28 05:07:21 26 4
gpt4 key购买 nike

我试图打印出遵循一定规则的前几个数字:它的数字之和可以提高到整数次幂以获得数字本身。 (基本上如果总和是数字的 n 次方根)。

比如81这个数的各位数字和是9,9^2就是81。

这是我正在使用的一些代码:

#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <math.h>
using namespace std;

int sumOfDigits(int num) {
int sum = 0;
string numStr = "";
stringstream s;
s << num;
s >> numStr;
for (int i = 0; i < numStr.length(); i++) {
int ad = 0;
stringstream ss;
ss << numStr[i]; // take each digit
ss >> ad;
sum += ad; // and add to sum
}
return sum;
}

int num = 10; // starting number
int numFound = 0; // how many such special numbers have been found

int main() {
while (numFound < 5) {
int sum = sumOfDigits(num);
double exp = log10(num) / log10(sum);

if (fmod(exp, 1.0) == 0.0 && sum != 1) { // if the exponent is an integer
cout << num << "\t" << sum << endl; // then print out the number and the sum of its digits
numFound++;
}
num++;
}

return 0;
}

当我运行它时,我得到以下输出:

81      9
2401 7
4913 17
5832 18
17576 26

第二个条目应该是 5128 因为 8^3 是 512。我不明白为什么测试适用于某些数字但不适用于其他的。

我也尝试过其他方法来测试指数是否为整数。我已经针对 floor() 表达式对其进行了测试,并且尝试使用 (int) 强制转换整个表达式。

我可能错了,问题可能不在那个地方,但如果你能帮我解决这个问题,我将不胜感激。谢谢。

最佳答案

像这样检查 float 之间的相等性:fmod(exp, 1.0) == 0.0 一定会给您带来麻烦。例如,只需像这样更改您的代码:

#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <math.h>
#include <limits>
using namespace std;

int sumOfDigits(int num) {
int sum = 0;
string numStr = "";
stringstream s;
s << num;
s >> numStr;
for (int i = 0; i < numStr.length(); i++) {
int ad = 0;
stringstream ss;
ss << numStr[i]; // take each digit
ss >> ad;
sum += ad; // and add to sum
}
return sum;
}

int num = 10; // starting number
int numFound = 0; // how many such special numbers have been found

int main() {
while (numFound < 5) {
int sum = sumOfDigits(num);
double exp = log10(num) / log10(sum);

if (fabs(fmod(exp, 1.0)) < std::numeric_limits<float>::epsilon() && sum != 1) { // if the exponent is an integer
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
cout << num << "\t" << sum << endl; // then print out the number and the sum of its digits
numFound++;
}
num++;
}

return 0;
}

我可以得到这个输出:

81  9
512 8
2401 7
4913 17
5832 18

因此,使用合适的 epsilon 值或只使用整数。

阅读这里:

What is the most effective way for float and double comparison?

关于C++ 检查 double 是否为整数在某些情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44380695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com