C言語関係掲示板

過去ログ

No.906 演算子のオーバーロードを使用した、有効桁数50桁の四則演算

[戻る] [ホームページ]
No.703

多倍長計算について
投稿者---あきら(2003/11/26 12:49:16)


演算子のオーバーロードを使用した、有効桁数50桁の四則演算のプログラムを作成しています.演算子のオーバーロードを使用する方法がどのように行えばいいのかよく解りません。誰か、おしえてくれませんか?

No.704

Re:多倍長計算について
投稿者---あきら(2003/11/26 13:05:17)


>演算子のオーバーロードを使用した、有効桁数50桁の四則演算のプログラムを作成しています.演算子のオーバーロードを使用する方法がどのように行えばいいのかよく解りません。誰か、おしえてくれませんか?
>上記につけたしで、演算子のオーバーロードを使用して、有効桁数50桁のアルゴリズムをおしえてくれませんか?
お願いします.


No.705

Re:多倍長計算について
投稿者---YuO(2003/11/26 13:14:43)


>演算子のオーバーロードを使用した、有効桁数50桁の四則演算のプログラムを作成しています.

演算子のオーバーロードってことは,C++ですか?
#以下,C++を仮定します。


>演算子のオーバーロードを使用する方法がどのように行えばいいのかよく解りません。

「何が」わからないのですか?
関数名がoperatorXXという形になる以外,他のメンバ関数とそれほど変わる点は無いと思いますが。
class foo {
public:
    foo& operator+= (const foo &);
};

inline foo operator+ (const foo & lhs, const foo & rhs)
{
    return foo(lhs) += rhs; // +演算子と+=演算子の整合性を常に保つ
}

foo & foo::operator+= (const foo & rhs)
{
    /* *thisとrhsの加算を行うコード */
    return *this;
}



No.706

Re:多倍長計算について
投稿者---あきら(2003/11/26 13:21:01)


返事ありがとうございます。
そうです。C++です。
有効桁数が50桁で表示させるため、char型の配列を使用しようと思っています。
char型の配列を使用した、演算子のオーバーロードの使い方について教えてくれませんか?お願いします。

No.707

Re:多倍長計算について
投稿者---たいちう(2003/11/26 13:33:18)


あなたが多倍長の計算方法を理解していないなら、過去ログを検索してください。
詳説つきのソースがきっと見つかるはずです。

演算子のオーバーロードについては、YuOさんの説明でも十分だと思うのですが、
せっかく書いたし、ひょっとしたら役に立つかもしれないので雛形を。

#include <iostream>

class Multi {
    int data;
public:
    Multi(int n = 0) : data(n) {}
    int GetData() const { return data; }
    Multi operator+(const Multi &m) const {
        return Multi(m.GetData() + data);
    }
};

int main()
{
    Multi a(5), b(7), c;
    c = a + b;
    std::cout << c.GetData() << std::endl;

    return 0;
}


No.708

Re:多倍長計算について
投稿者---あきら(2003/11/26 13:44:18)


返事ありがとうございます。
operator関数を使用することは解るのですが、文字や配列を使用するとエラーが表示されてしまい、どうすることもできません。
文字列を使用した、簡単な四則演算のプログラムをおしえてくれるとありがたいのですが・・・。

No.710

Re:多倍長計算について
投稿者---YuO(2003/11/26 13:51:29)


>operator関数を使用することは解るのですが、文字や配列を使用するとエラーが表示されてしまい、どうすることもできません。

No. 709で書いたとおり,charや配列のままでは演算子の多重定義はできません。
クラスで包む必要があります。


No.709

Re:多倍長計算について
投稿者---YuO(2003/11/26 13:49:50)


>有効桁数が50桁で表示させるため、char型の配列を使用しようと思っています。
>char型の配列を使用した、演算子のオーバーロードの使い方について教えてくれませんか?お願いします。

演算子のオーバーロードを行うためには,次の条件を満たす必要があります。
operator new, operator delete, operator new[], operator delete[]
次の内の何れか
  • クラスのメンバ関数
  • グローバル関数
代入及び複合代入, 関数呼び出し, 添字付け, メンバアクセス各演算子
クラスの非staticメンバ関数
それ以外の演算子
次の内の何れか
  • クラスの非staticメンバ関数
  • 最低一つ以上の引数が次の型の何れかである非staticメンバ関数
    • a class
    • a reference to a class
    • an enumeration
    • a reference to an enumeration


なので,char型の配列のままではオーバーロードは失敗します。


No.711

Re:多倍長計算について
投稿者---あきら(2003/11/26 13:57:19)


では、char型の配列では、演算子のオーバーロードは使用できないのでしょうか?
よく解らないので、詳しくお願いします。


No.713

Re:多倍長計算について
投稿者---YuO(2003/11/26 14:05:26)


>では、char型の配列では、演算子のオーバーロードは使用できないのでしょうか?

そう書いたのですが。

まずは文法解説書をきっちり読んでください。
まともな本であれば,このくらいのことは解説してあるはずです。
#C++の言語解説で「まともな本」が世にどれだけあるかは知らないが……。


No.714

Re:多倍長計算について
投稿者---あきら(2003/11/26 14:14:25)


まともな本がないから困っています。
なにか例をくださるとありがたいなと思っています。

No.712

Re:多倍長計算について
投稿者---YuO(2003/11/26 14:03:10)


eratta.


> 最低一つ以上の引数が次の型の何れかである非staticメンバ関数
最低一つ以上の引数が次の型の何れかである非メンバ関数


No.715

Re:多倍長計算について
投稿者---あきら(2003/11/26 14:30:19)


まとまな本がないから困っているのです。
なにか、例文(文字配列を使用した足し算)のようなものがあるとありがたいです。

No.716

Re:多倍長計算について
投稿者---かずま(2003/11/26 15:51:54)


> まとまな本がないから困っているのです。

「まとまな本」?
「まともな本」でしょう。
あなたが、「まともでないと思った本」をすべて挙げてみてください。


> なにか、例文(文字配列を使用した足し算)のようなものがあるとありがたいです。

では、次のプログラム例から、分かることと分からないことをできるだけ
たくさん、くわしく書いてください。
#include <iostream>

class Multi {
    char v[50];
public:
    Multi(const char *s = "");
    Multi& operator+=(const Multi& x);

    friend std::ostream& operator<<(std::ostream& os, const Multi& x);
};

Multi::Multi(const char *s)
{
    int i, n = strlen(s);
    for (i = 0; i < n; i++) v[i] = s[n-i-1] - '0';
    for (; i < 50; i++) v[i] = 0;
}

Multi& Multi::operator+=(const Multi& x)
{
    int carry = 0;
    for (int i = 0; i < 50; i++) {
        v[i] += x.v[i] + carry;
        carry = v[i] >= 10;
        if (carry) v[i] -= 10;
    }

    return *this;
}

Multi& operator+(const Multi& a, const Multi& b)
{
    return Multi(a) += b;
}

std::ostream& operator<<(std::ostream& os, const Multi& x)
{
    int i = 50;
    while (--i > 0 && x.v[i] == 0) ;
    while (i >= 0) os << int(x.v[i--]);
    return os;
}

int main()
{
    Multi a = "12345678901234567890123", b = "123", c;
    c = a + b;
    std::cout << a << " + " << b << " = " << c << std::endl;
}


No.718

Re:多倍長計算について
投稿者---あきら(2003/11/26 16:45:59)


ごめんさい。言い過ぎました。
プログラムありがとうございます。
解読して結果を報告します。

No.720

Re:多倍長計算について
投稿者---かずま(2003/11/26 17:47:22)


> Multi& operator+(const Multi& a, const Multi& b)
> {
>     return Multi(a) += b;
> }

訂正
  Multi operator+(const Multi& a, const Multi& b)
  {
      return Multi(a) += b;
  }