簡體   English   中英

C ++在某些情況下無法檢查雙精度數是否為整數

[英]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

第二個條目應該是5128因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM