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
てか単に自己満足、そして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
カレンダー
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]
最新記事
(07/28)
(07/15)
(05/04)
(04/30)
(04/17)
(03/05)
(02/21)
(02/16)
(02/01)
(01/29)
最新トラックバック
ブログ内検索