[英]C++ Checking if a double is an integer does not work in some cases
我正在嘗試打印出遵循特定規則的前幾個數字:可以將其數字的總和提高至一個整數,以獲取數字本身。 (基本上,如果總和是數字的第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
第二個條目應該是512
和8
因為8 ^ 3是512。我不明白為什么測試使用某些數字但不能使用其他數字。
我嘗試了其他方法來測試指數是否也是整數。 我已經針對floor()
表達式進行了測試,並嘗試使用(int)
轉換整個表達式。
我可能錯了,問題可能不在那個地方,但是如果您能幫助我,我將不勝感激。 謝謝。
像這樣檢查浮點數之間是否相等: fmod(exp, 1.0) == 0.0
一定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值或僅堅持整數。
在這里閱讀:
循環求和和指數要快得多:
unsigned int number;
unsigned int min_sum = 3;
unsigned int max_sum = 100;
unsigned int min_exp = 2;
unsigned int max_exp = 20;
int main() {
for (unsigned int exp = min_exp; exp <= max_exp; ++exp)
for (unsigned int sum = min_sum; sum <= max_sum; ++sum) {
number = pow(sum, exp);
if ( sumOfDigits(number) == sum )
cout << numFound++ << ":\t" << number << "\t = " << sum << " ^ \t" << exp << endl;
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.