1

間隔内のすべての整数の完全な平方根を出力する必要があるプログラムがあります。今、私はn-the rootに対してそれをしたい.

これが私がやったことですが、fmodで立ち往生しています。

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

int nroot(int, int);

int main()
{

    int p, min, max,i;
    double q;

    cout << "enter min and max of the interval \n";
    cin >> min;
    cin >> max;
    cout << "\n Enter the n-th root \n";
    cin >> p;
    i = min;

    while (i <= max)
    {
        if (fmod((nroot(i, p)), 1.0) == 0)
        {
            cout << nroot(i, p);
        }
        i++;
    }
    return 0;
}

int nroot (int i, int p){

    float q;
    q = (pow(i, (1.0 / p)));

    return q;
}
4

2 に答える 2

2

これとは逆の方向に取り組みたいと思うかもしれません。区間内のすべての値の n 乗根を取得して n 乗根が整数であるかどうかを確認するのではなく、区間の境界の n 乗根を取得し、根に関してステップします。

// Assume 'min' and 'max' set as above in your original program.
// Assume 'p' holds which root we're taking (ie. p = 3 means cube root)
int min_root = int( floor( pow( min, 1. / p ) ) );
int max_root = int( ceil ( pow( max, 1. / p ) ) );

for (int root = min_root; root <= max_root; root++)
{
    int raised = int( pow( root, p ) );
    if (raised >= min && raised <= max)
        cout << root << endl;
}

forループ内の追加のテストは、 または がルートに直接到達する場合、minまたはmaxルートのすぐ横に到達する場合を処理することです。

raisedループの境界でのみ必要とされることを認識することで、ループからテストと計算を削除できます。このバージョンは、見た目が少し複雑ですが、その観察を実装しています。

// Assume 'min' and 'max' set as above in your original program.
// Assume 'p' holds which root we're taking (ie. p = 3 means cube root)
int min_root = int( floor( pow( min, 1. / p ) ) );
int max_root = int( ceil ( pow( max, 1. / p ) ) );

if ( int( pow( min_root, p ) ) < min )
    min_root++;

if ( int( pow( max_root, p ) ) > max )
    max_root--;

for (int root = min_root; root <= max_root; root++)
    cout << root << endl;

パフォーマンスが本当に心配な場合 (この場合はそうではないと思います)、int( pow( ..., p ) )n 乗を完全に整数演算で計算するコードに置き換えることができます。しかし、それはやり過ぎのようです。

于 2013-11-09T19:11:18.193 に答える
1

浮動小数点数の正確な等価性テストは、期待どおりに機能しない場合があります。いくつかの小さな数と比較することをお勧めします。

float t = nroot(i, p);
if (fabs(t - rintf(t)) <= 0.00000001)
{
  cout << t << endl;
}

この場合でも、min、max、および p のすべての値に対して正しい結果が得られるとは限りません。すべては、数値を表すこの小さな数値と精度に依存します。"double" や "long double" などのより長いフローティング タイプを検討することもできます。

于 2013-11-09T19:17:41.297 に答える