5

次の方法で数値の平方根を計算するコードがあります。

void f1(int,int);

int main(){
    int i=1;
    int n;
    scanf("%d",&n);
    f1(n,i);
    getch();
    return 0;
}

void f1(int n,int i){
    if((n*10000)-(i*i)<=0)
        printf("%f",(double)i/100);
    else
        f1(n,i+1);
}

を使用する理由がわかりませんn*10000 - i*i。誰かがこのコードを説明できますか?

4

5 に答える 5

8

例を考えてみましょうn=100。再帰の最初の束については、i=1,2,3,.... したがって、これらの呼び出しでは、 が得られn*10000 - i*i >= 0ます。それからある時点で、それi=999を観察しn*10000 - 999*999 >= 0ます。次の再帰ステップには があり、それがi=1000わかるn*10000 - 1000*1000 <= 0ので、 を出力します。ご覧のとおり、結果は の平方根にすぎません。(double)i / 10010n=100

一般に、次の理由により、i/100条件を満たす最小数n*10000 - i*i <= 0は の平方根に「かなり近い」です。n

sqrt(n*10000) = sqrt(n)*sqrt(10000) = sqrt(n)*100

そして、次のものがあります。

n*10000 - i*i <= 0            | +i*i
      n*10000 <= i*i          | sqrt both sides
  sqrt(n)*100 <= i            | /100
      sqrt(n) <= i/100

i/100したがって、以上の最小の数を探し、sqrt(n)この数を の近似値として使用しsqrt(n)ます。

于 2013-11-12T08:30:14.730 に答える
1

それは、ある程度の精度を追加することです。

void f1(int n,int i){
    printf("value of i is=%d \n",i);
    if(n-i*i<=0)
        printf("%f",i);
    else
        f1(n,i+1);
}

このコードは、完全平方数に対してのみ機能します。

void f1(int n,int i){
    printf("value of i is=%d \n",i);
    if((n*100)-(i*i)<=0)
        printf("%f",(double)i/10);
    else
        f1(n,i+1);
}

このコードはすべての数値に対して機能しますが、浮動小数点の後の 1 桁のみの結果が得られます。

void f1(int n,int i){
    printf("value of i is=%d \n",i);
    if((n*10000)-(i*i)<=0)
        printf("%f",(double)i/100);
    else
        f1(n,i+1);
}

これは、浮動小数点の後に 2 桁の精度を与えるコードです。(n*10000)-(i*i) が要件に応じて必要になるようにします。完璧なものだけを見つけたい場合は、最初のコードも使用できます。

于 2013-11-12T08:40:34.203 に答える
0

結果が小数点以下 2 桁に丸められるためです。

たとえば、n=10 の場合、結果は 3.17 になります。

結果を小数点以下 3 桁に丸めたい場合は、次のように記述できます。

if((n*1000000)-(i*i)<=0) printf("%f",(double)i/1000);

于 2013-11-12T09:07:06.793 に答える