忍者ブログ
mirac cafe という名の不思議なブログ

※ ブログ等での私の投稿は個人の見解によるものであり、 所属する組織の見解ではありません。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

最近人の役に立ってない気がするので人の役に立つようなことを書いてみるテスト。

てか単に自己満足、そしてC言語が分かる人限定(すいませんorz)

何書こうかな、、考えてから書き始めろよって感じだよね(笑)


よし、、多倍長計算でも書いてみよう。

ご存知のとおりint型は32bitだったり64bitだったりするわけですが、

それより大きな値を扱いたい場合にどうするか。

たとえば日本の予算は何十兆とからしいですが、

それですら32bitでは表すことができません。じゃどうしようかな、と。


一番分かりやすいのは、文字列型で数字を表現してしまうことです。

要するに、123とか456とかの数字を、

char s[]="123";とかchar t[]="456"とかいうように、

数値でなくて文字列して持ってしまう、ということ。


話を簡単にするために、sの桁数とtの桁数が同じで、

かつ繰り上がりがないと仮定すれば、

この場合の足し算は以下のように計算できます。


//---------------------------------------------
//s+tを計算して結果をsに格納

int i;       //loop用
int len=strlen(s); //桁数を取得
int extra=0;    //繰り上がりがあるかないか

for(i=len-1;i>=0;i--){ //1の位から順番に計算

 s[i]+=(t[i]-'0'); //t[i]-'0'で文字コードを数値に変換
 if(extra)s[i]++; //前の桁からの繰り上がりを考慮

 if('9'<s[i]){ //次の桁への繰り上がりがあるとき
  extra=1;
  s[i]-=10;
 }else{    //次の桁への繰り上がりがないとき
  extra=0;
 }
}

//---------------------------------------------


分かりやすく書いてみたつもりだけどどうでしょうか?

興味があるから続けてくれって言う人がいたら、、

実用的な多倍長計算まで書いてみますので、、

そんなひとはコメントをよろしくw



ちなみに上のソースコード、こうも書けます。


//---------------------------------------------
//s+tを計算して結果をsに格納 (その2)

int i;       //loop用
int len=strlen(s); //桁数を取得
int extra=0;    //繰り上がりがあるかないか

for(int i=len-1;i>=0;i--){ //1の位から順番に計算

 s[i]+=(t[i]-'0')+extra;

 extra=('9'<s[i]);
 if(extra)s[i]-=10;
}

//---------------------------------------------


for文の中しか変わってませんが。

ポイントは比較演算子とかはtrueの時1、falseの時1を返すってことです。

なのでextra=('9'<s[i])ってやっても常にextraは0か1なのです。


んー、、ちょっとは為になったかな?w
PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
無題
>trueの時1、falseの時1を返すってことです。
1が返りまくりだな
Remya 2009/03/21(Sat)23:25:52 編集
無題
あっちゃぁ...orz
mirac 2009/03/23(Mon)16:20:12 編集
この記事へのトラックバック
この記事にトラックバックする:
カレンダー
06 2025/07 08
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
フリーエリア
最新コメント
[11/30 kamae]
[04/30 mirac]
[04/29 渚]
[01/20 渚]
[01/01 mirac]
[12/09 mirac]
[10/31 mirac]
[03/14 mirac]
[08/10 404ななしさん]
[08/09 halwhite]
最新記事
最新トラックバック
ブログ内検索
忍者ブログ [PR]