2016-04-30 11 views
0

私がコーディングしているプログラムは、与えられたdoubleのルートを見つけるはずです。whileループとwhileループなしでルートを見つけよう

条件はwhileループとforループの使用が許可されていないことです。どんな種類のループも許されません。

私たちの教授は、stdlibファンクションsqrt()を使用することは禁止されていると言いました。

私はコードを作成し始めましたが、まだ動作していません。誰もが助けることを願って

#include <cstdlib> 
#include <iostream>  
using namespace std; 

double mysqrt(double a, double b, double c); 

int main(int argc, char** argv) { 
    double dBegin{0}; 
    double dOldroot{0}; 
    double dNewroot{0}; 
    double a{0};1 

    cin >> dBegin; 
    dOldroot = dBegin; 
    mysqrt(a, dOldroot, dNewroot); 
    cout << dNewroot; 
    return 0; 
} 

double mysqrt(double a, double b, double c) { 
    c = (b + (a/b))/2.0; 
    if (a != 8) { 
     c = mysqrt(a++, b, c); 
    } 
    return c; 
} 
+0

"それはstdlib関数sqrtを使用することを禁じられています"次に、 'sqrtl()'の使用はどうですか? – MikeCAT

+2

ヒント:[ニュートンの方法 - Wikipedia、無料の百科事典](https://en.wikipedia.org/wiki/Newton%27s_method) – MikeCAT

+0

関連リンク:https://www.careercup.com/question?id=6657802751705088 –

答えて

0
  • あなたは最初の引数が更新されませんので、あなたのコードは無限再帰を行いますdouble a{0};
  • 後にコンパイルエラーが発生するジャンク1を持っています。カウンターにdoubleを使用することも良い考えではありません。
  • mysqrtから返された値をmain()に投げ捨てています。
  • 引数を値を読み取らずにローカル変数として使用することはお勧めできません。これらのエラーを修正

、あなたのコードは次のようになります。

#include <cstdlib> 
#include <iostream> 

using namespace std; 

double mysqrt(int a, double b); 

int main(int argc, char** argv) { 

    double dBegin{0}; 
    double dOldroot{0}; 
    double dNewroot{0}; 
    int a{0}; 

    cin >> dBegin; 
    dOldroot = dBegin; 

    dNewroot = mysqrt(a, dOldroot); 

    cout << dNewroot; 

    return 0; 
} 

double mysqrt(int a, double b) { 
    double c = (b + (a/b))/2.0; 
    if (a != 8) { 
     c = mysqrt(a + 1, b); 
    } 
    return c; 
} 

このコードは、平方根を計算することができなかったが、コンパイルおよび実行したときにすぐに終了しました。

+0

お返事ありがとうございます。正しい平方根を得るためにはどうすればいいですか? – faismub

1

私は(私のコードでは)与えられた数numの平方根を見つけるためにニュートン・ラプソン法のを使用しています。

あなたはこのビデオリンクが役立つかもしれません:Click Here。このアルゴリズムを使って私はこの問題を解決しました。

ここに私のコードです。

#include <iostream> 
using namespace std; 

/* we are gonna use Newton-Raphson's method to find its square because 
    it converges quickly, even calculators use this algo. to find the sqr-root */ 

double find_sqrt(double x, int num, int count) { 
    if(count == 0) 
     return x; 

    double f_x = x*x - num; 
    double f_dx = 2*x; 
    double res = x - (f_x/f_dx); 

    x = find_sqrt(res, num, count -1); 
    return x; 

} 

int main() { 
    double num; 
    cin >> num; 

    /* Here 20 is the maximum number of times it will run and 
    num/2 is the random number send to the function between the range 1 to num */ 
    cout << find_sqrt(num/2, num, 20); 

    return 0; 
} 

結果はあまり正確ではないかもしれませんが、それは常に、ほぼ近い数の実際の平方根になります。
理由:浮動小数点エラーです。あなたはこれについて私が信じていることを知っていなければなりません。

+0

気を付けてください。 'num = 0'の場合、このコードは失敗します。だからそれに気をつけてください – surajsn

関連する問題