多倍長数を使って円周率を求める

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

多倍長数を使って円周率を求める

#1

投稿記事 by SASUKE » 2年前

この掲示板を初めて使うので、不備などがあれば申し訳ないです。
・自分は今なにがしたいか
C言語で多倍長数を使用して円周率を求めたいです。
Machinの公式を使用して求めます。
『配布されたコードを実数に対応させ、小数点以下も表現できるように拡張する必要がある。
具体的には,配列中のある要素を整数部分の一の位に対応させ,その要素よりも右側(添字が大きい側)の要素
を順に小数第1 位,小数第2 位,· · · に対応させる』
まず拡張する部分で詰まっています。


--配布されたコード--

コード:

void set(int value, int a[], int n){
	int i;
	for(i=n-1; i>=0; i--){
		a[i] = value % 10;
		value = value / 10;
	}
	return;
}
void tasu(int a[], int b[], int n){
	int i;
	for(i=n;i>0;i--){
		a[i] = a[i] + b[i];
		if(a[i]>=10){
			a[i] = a[i] % 10;
			a[i-1]++; 
		} 
	}
}
void hiku(int a[], int b[], int n){
	int i;
	for(i=N-1; i>=0;i--){
		a[i] = a[i] - b[i];
		if(a[i]<0){
			a[i-1]--;
			a[i] = a[i] + 10;
		}
	}
	return;
}

void kakeru(int a[], int n, int k){
	int i,tmp;
	int carry = 0;

	for(i=N-1;i>=0;i--){
	tmp = a[i] * k + carry;
	a[i] = tmp % 10;
	carry = tmp/10;
	}
	return;
}

void waru(int a[], int n, int x){
	int i,tmp;
	tmp = 0;

	for(i=0; i<N; i++){
		tmp = tmp*10 + a[i];
		a[i] = tmp / x;
		tmp = tmp % x;
	}
}
公式
------------------------------------------------------------------------
(注意)以降では,数値x を多倍長数として表現したものを「多倍長数(x)」,int 型として表現したものを「int 型(x)」と表記する.「多倍長数(x) ←1」という書き方は,「多倍長数として表現した変数x(配列x)に1 を格納する」という意味である.

/*左のΣを計算*/
多倍長数(a) ←0
■n を0 からN まで1 ずつ増やしながら,以下の処理を繰り返す
•多倍長数(t) ←1
•多倍長数(t) ←多倍長数(t) ÷ int 型(2n + 1)
■2n + 1 回,以下の処理を繰り返す
•多倍長数(t) ←多倍長数(t) ÷ int 型(5)
▲n が偶数ならば
•多倍長数(a) ←多倍長数(a) + 多倍長数(t)
そうでないならば
   •多倍長数(a) ←多倍長数(a) − 多倍長数(t)
•多倍長数(a) ←多倍長数(a) × int 型(4)
/* 右の∑ を計算*/
•多倍長数(b) ←0
■n を0 からN まで1 ずつ増やしながら,以下の処理を繰り返す
•多倍長数(t) ←1
•多倍長数(t) ←多倍長数(t) ÷ int 型(2n + 1)
■2n + 1 回,以下の処理を繰り返す
•多倍長数(t) ←多倍長数(t) ÷ int 型(239)
▲n が偶数ならば
・多倍長数(b) ←多倍長数(b) + 多倍長数(t)
そうでないならば,
・多倍長数(b) ←多倍長数(b) − 多倍長数(t)
/*最後の仕上げ*/
• 多倍長数(a) ←多倍長数(a) − 多倍長数(b)
• 多倍長数(a) ←多倍長数(a) × int 型(4)
• 多倍長数(a) の内容を表示
------------------------------------------------------------------------

よろしくお願いいたします

アバター
tk-xleader
記事: 158
登録日時: 13年前
連絡を取る:

Re: 多倍長数を使って円周率を求める

#2

投稿記事 by tk-xleader » 2年前

既に解決していたら申し訳ないんですが…

配布されたコードは、set関数が、n桁の自然数から、10進法における各位の桁の数を1の位をa[n-1]、10の位をa[n-2]、100の位をa[n-3]...という風に配列に格納する関数で、残りの関数が、その配列同士を筆算の要領で四則演算しているコードになりますね(ここまでは大丈夫でしょうか?)。

それで、これを小数に対応させる方法としては、単純に、四則演算の関数に、配列中の1の位を表している要素の添え字を取る整数型の引数を増やして、後は小数点を含む筆算の要領で四則演算の関数を書き直すことになるかと思います。
(なお、全ての配列の1の位の位置が同じということであれば、加減算は何もしなくてもよいかもしれませんが…)

返信

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