c言語

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ykneu

c言語

#1

投稿記事 by ykneu » 10年前

[1] 質問文
 [1.1] 自分が今行いたい事は何か:a^(n/m)をpow関数やexp関数を使わないで求めるプログラムを作りたい。(m,nは正の整数でaは非負の実数でともにキーボードから入力する)
 [1.4] 今何がわからないのか、知りたいのか:a^nはforなどを使って表すことができるのはわかるが、a^(1/m)はどうあらわすのかわかりません。教えてもらえませんか?

[2] 環境  
 [2.2] コンパイラ名 : gcc

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: c言語

#2

投稿記事 by みけCAT » 10年前

ykneu さんが書きました:a^nはforなどを使って表すことができるのはわかるが、a^(1/m)はどうあらわすのかわかりません。教えてもらえませんか?
a^(1/m)はaのm乗根なので、aやmが十分小さい(オーバーフローなどを考えない)場合は、例えば
0<=a<=1なら0~1、
1<=aなら1~a
を対象に二分探索をすれば求めることができます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: c言語

#3

投稿記事 by かずま » 10年前

an は、for を使うよりも乗算回数を減らすことができます。

コード:

#include <stdio.h>

double pow1(double x, int n)   // x^n
{
    double y;

    if (n == 0) return 1;
    if (n == 1) return x;
    if (x == 0) return 0;
    if (x == 1) return 1;
    y = pow1(x, n >> 1);
    y *= y;
    return (n & 1) ? y * x : y;
}

double pow2(double x, int n)   // x^(1/n)
{
    double a, b, m, y;  int i;

    if (n == 1) return x;
    if (x == 0) return 0;
    if (x == 1) return 1;
    if (x < 1) a = x, b = 1;
    else a = 1, b = x;
    for (i = 0; i < 80; i++) {
        m = (a + b) / 2;
        y = pow1(m, n);
        if (y == x) break;
        if (y < x) a = m;
        else b = m;
    }
    return m;
}

double pow3(double x, int n, int m)   // x^(n/m)
{
    return pow1(pow2(x, m), n);
}

int main()
{
    double a;  int n, m;

    while (printf(">> "), scanf("%lf%d%d", &a, &n, &m) == 3)
        printf("%.15g\n", pow3(a, n, m));
    return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る