No.3ベストアンサー
- 回答日時:
★アドバイス
・次のリンクの『多倍長整数演算ライブラリ』の項目を参考に簡単な30桁の四則演算を作成してみて下さい。
http://www5.airnet.ne.jp/tomy/cpro/csource.htm→『技術計算用Cプログラム ソース』
・long long 型が使えるのならば1つの要素を long 型で 1000,000,000 進法で表現して乗算、除算の
ときに long long 型を使います。もし、long long 型が使えない環境なら1つの要素は short 型の
10,000 進法を使います。この場合は乗算、除算では long 型になります。
・構造体は
typedef struct {
int sin; ←符号(-1,0,+1)
int len; ←num の有効数
long num[ 4 + 1 ]; ←多倍長整数の要素配列
} longint_t;
↑
これを参考に四則演算の関数群を用意してみる。
1要素が long 型なので 9桁×4要素=36桁まで計算可能。
サンプル:
// 1要素のベース値
#define BASE_VALUE (1000000000L)
// 絶対値の加算
void abs_add( long ans[], long a[], long b[], int len )
{
int i, carry = 0;
for ( i = 0 ; i < len ; i++ ){
if ( (ans[i] = (a[i] + b[i] + carry)) >= BASE_VALUE ){
ans[ i ] -= BASE_VALUE;
carry = 1;
}
else{
carry = 0;
}
}
}
// 絶対値の減算(必ず大きい数から小さい数を引くこと)
void abs_sub( long ans[], long a[], long b[], int len )
{
int i, borrow = 0;
for ( i = 0 ; i < len ; i++ ){
if ( (ans[i] = (a[i] - b[i] - borrow)) >= BASE_VALUE ){
ans[ i ] += BASE_VALUE;
borrow = 1;
}
else{
borrow = 0;
}
}
}
// 絶対値の比較(-1:a<b, 0:a=b, +1:a>b)
int abs_cmp( long a[], long b[], int len )
{
while ( --len >= 0 ){
if ( a[len] != b[len] ){
return (a[len] < b[len]) ? -1 : +1; // 大小値
}
}
return 0; // 一致
}
// 多倍長整数の加算(符号対応)
longint_t add( longint_t a, longint_t b )
{
longint_t ans = { 0 };
if ( a.sin == b.sin ){ // 符号が同じ
abs_add( ans.num, a.num, b.num, ans.len );
ans.sin = a.sin;
}
if ( abs_cmp(a,b) > 0 ){ // a が大きい
abs_sub( ans.num, a.num, b.num, ans.len );
ans.sin = a.sin;
}
else{ // b が大きい
abs_sub( ans.num, b.num, a.num, ans.len );
ans.sin = b.sin;
}
return ans;
}
// 多倍長整数の減算(符号対応)
longint_t add( longint_t a, longint_t b )
{
longint_t ans = { 0 };
if ( a.sin != b.sin ){ // 符号が異なる
abs_add( ans.num, a.num, b.num, ans.len );
ans.sin = a.sin;
}
if ( abs_cmp(a,b) > 0 ){ // a が大きい
abs_sub( ans.num, a.num, b.num, ans.len );
ans.sin = a.sin;
}
else{ // b が大きい
abs_sub( ans.num, b.num, a.num, ans.len );
ans.sin = b.sin;
}
return ans;
}
最後に:
・配列の[0]を一番小さい桁の要素として計算しています。
つまり、111111111222222222333333333444444444 という数値は
num[0]⇒444444444
num[1]⇒333333333
num[2]⇒222222222
num[3]⇒111111111
num[4]⇒オーバーフロー用
となります。
・サンプルではオーバーフローのチェックは付けていません。
上位関数などでチェックして下さい。
・残りの乗算、除算、剰余、その他はご自分で作成してみて下さい。
文字列への変換は 10 進数なら簡単に sprintf() 関数で出来ます。
・以上。参考に!
参考URL:http://www5.airnet.ne.jp/tomy/cpro/csource.htm
No.2
- 回答日時:
この程度であれば、あまり高機能な多倍長演算でなくても、桁上がりだけ処理してやれば十分な気がします。
つまり、
1. 下位ワードの加算
2. 桁上がりがあれば、上位ワードをインクリメント
3. 2.を必要なワード数繰り返す
後は、加算する数が負の場合のことを考えて、もう一ひねりすれば完成です。
ちなみに、8ビットのCPUで16ビットや32ビットの加算を行うときは、大抵このようなことをアセンブリ言語で記述します。
ただ、加算はこれで構いませんが、結果の表示を10進数で行うのであれば、そのときに除算が必要になります。
除算は面倒なので、はじめから各ワードが0~999999の範囲を表現するなどにしておいた方がよいでしょう。
(各ワードが6桁ずつなら、3桁ずつ区切って出力するのも簡単なので)
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) Excelで時間計算(負) 8 2023/02/26 05:47
- Excel(エクセル) エクセルのSUM関数について 4 2023/04/18 10:37
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Excel(エクセル) 関数で割合を表示する 2 2022/09/27 06:09
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- Chrome(クローム) Chromeの描画領域を2分割して異なるスクロール位置を同時に表示させることはできますか 1 2023/03/01 16:53
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Excel(エクセル) エクセル 自動計算 1 2023/01/30 13:28
- 情報処理技術者・Microsoft認定資格 応用情報処理技術者試験のシステム利用率の計算について 2 2022/03/28 07:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
C言語で電卓を作成する。
-
C言語プログラムが理解できなくて…
-
while文について、c言語...
-
配列を使って魔方陣
-
scanf関数を用いての加減乗除%...
-
プログラム
-
C言語 数字以外を入力させない...
-
getcの改行判定
-
while文でπ/4の近似値を求める
-
初心者です。for文、if文を使っ...
-
c言語のwhile文を使った計算で...
-
for文の中にswitch文はいれられ...
-
c言語プログラミングで1から100...
-
C言語です
-
C言語。どうしてコンパイルでき...
-
プログラミングで二番目に大き...
-
計算結果がlong型以上になる場...
-
C言語:forを用いたプログラム
-
c言語で平均をだす
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
#if 1 #elseの意味について
-
プログラミングで二番目に大き...
-
getcの改行判定
-
C言語プログラムが理解できなくて…
-
C言語 数字以外を入力させない...
-
配列を関数に渡す方法
-
配列を使って魔方陣
-
初心者です。for文、if文を使っ...
-
c言語for文
-
c言語で平均をだす
-
while文について、c言語...
-
scanf関数を用いての加減乗除%...
-
行列をべき乗させるプログラム
-
c言語プログラミングで1から100...
-
C言語階乗の総和を求める
-
scanfが実行されません
-
階乗のプログラム!!
-
C言語の二分法のプログラムにつ...
おすすめ情報