精密加算、減算、乗算、除算

実行するために5つのエリアに分かれています。

1.高精度の番号が格納され、I「クリア神ブック」int配列は、データを格納するint型の長さを示す構造体bignを使用することを含むに従って、当然のことながら、便宜のために、我々は、法線方向や図形のサイズの配列方向を記憶しますそれどころか、私たちはとても便利なの後に計算、小型低次数の配列を格納しています

2.さらに、さらには直接のシミュレーションをする必要があり、あまり他ではないと言って、ライン上のキャリーキャリーを格納するのに使用することを忘れないでください

2.減算は、減算は、それは、先頭の0を除去するために、最終的に高い場所-1 +10自身の位置、及び両方のより高い接地ボローであります

4.乗算、乗算も簡単なアナログであり、2つずつ、すべての数は、乗算した後、合計します

すべてのシミュレーション全体のプロセスの最初の5部門では、それはまた、アナログ持っているものの部門は、最も困難なものですが、あなたがた回数で割った高精度、高精度が少し難しく使用し、明確にする必要があります。

  入力された被除数A、除数B

  各サイクルの残り=配当+ 10 *除数による被除数と現在位置の数(すなわち、我々の除数入力除数B)、もし

  (1)十分に加えて、それはビジネス、そして新たな余りになるだろう

  除去されない場合(2)、被除数が残りに直接割り当てられ

  次のランの全ビットまで、ループに入ります

  そこには、高精度の正確さによって分割されるため、(1)どのように除去される技術は、あるので、私は内蔵分割を使用することができない、減算分割をシミュレートするためにここで使用される(すなわち、減少がなくなるまで減少し続けます)

 

書式#include <iostreamの> 
書式#include <stdio.hに> 
する#include < 文字列 > 
の#include <CStringの>
 使用して 名前空間はstd; 

const  int型のmax_size = 1000年

構造体bign {
     INT D [MAX_SIZE]。
    int型のlen; 
    bign(){ 
        LEN = 0 
        memsetの(D、0はsizeof (d)参照)。
    } 
}。

bign to_bign(文字列strの){ 
    bign大きいです。
    INTのサイズ= str.size()。
    big.len= サイズ;
     のためにint型 I = 0 ; I =サイズ; ++!I)
        big.d [I] = STR [サイズ- 1。 - -i] ' 0 ' ;   // 文字列はchar型intに変換されることに注意してください、-'0「で作業使用
    リターン;ビッグ
} 

追加をbign(bign A、B bign){ 
    bign Cを、
    int型キャリー=で0 ;
     のためint型 I = 0を I <= a.len-; 1。 || Iに< b.len- = 1 ; ++ I){
         int型のキャリー付きTEMP = ADの+ [I] + BD [I]、
        CD [c.len ++] = TEMP%以下10 ; 
        キャリー = TEMP / 10 
    } 
    もし(!キャリー= 0 ){ 
        CD [c.len ++] = キャリー。
    } 
    戻りC。
} 

int型CMP(bign bをbign){
     int型のI。
    もし(a.len> = b.len)
        I = a.len。
    他の I = b.len。
    (; I> = 0 ; i-- ){
         場合(AD [i]が> BD [i])とリターン 1 それ以外の 場合(広告[I] <BD [i])とリターン- 1 ; 
    } 
    戻り 0 ; 
} 

bignサブ(bign A、B bign){ // AB&すなわちA> Bを確保する
    bignのCと、
     のためのint型 I = 0 {; Iはa.len <Iは++)   // Aそれは確かに長い
        IF(AD [I] -bd [I] < 0 ){ 
            AD [Iが + 。1 - ] ; 
            AD [I] + = 10 ; 
        } 
        CD [c.len ++] = AD [ I] - BD [I]; 
    } 
    // プリアンブル0を排除
    しながら(c.len-を1 > = 1&& CD [c.len- 1 ] == 0 ){ 
        c.len - 
    } 
    戻りC。
} 

bign(bignのB、bign)マルチ{ 
    bignのC; 
    以下のためにint型私= 0 ; iがa.len <; ++ i)が{
         INT、M = AD [i]は、
        INT J = 0 ; J <b.len; ++ J){
             int型の TEMP = CD [iがjは+] +のm *のBD [J]。
            CD [iが jは+] =一時%10 
            CD [iが + J + 1 ] + = TEMP / 10 
        } 
    } 
    IF(CD [a.len + b.len- 1。!] = 0 
        c.len = a.len + b.len;
      c.len + = a.len b.len- 1。;
     返すCを; 
} 

// ああ書くこと懸命精度で割った精度、オリジナルカードIアナログ分周減算
bignのresult_n; 
bign remain_n; 
bign分割(bign A、B bign){ // A / Bの
    INTのビット= B .LEN; 
    bignが残っ; 
    bign SUB1、
    文字列result_str;
     のためのINT I = a.len- 1。 ; I> = 0 ; - I){
        残る=マルチ(まま、to_bign(" 10 "))。// 余数* 10 
        の文字列strの。
        STR + =(' 0 ' + AD [I])。
        SUB1は、 = (to_bign(STR)、残っている)を追加。
        INT if_bigger = CMP(SUB1、B)。
        もし(if_bigger> = 0 ){
             // 法模拟除法
            INTカウント= 0 ;
            一方(CMP(SUB1、B)> = 0 ){ 
                SUB1 = サブ(SUB1、B)。
                カウント ++ ; 
            } 
            result_str + =(' 0 ' +カウント)。// 存下商が 
            残る= SUB1。// 保留此次余数
        }
         { 
            まま = SUB1。
        } 
    } 
    result_n = to_bign(result_str)。
    remain_n = 残っています。
} 

ボイドprint_bign(bign b)は{
     ためint型 I = b.len- 1 ; I> = 0 - ; I)
        のprintf(" %dの"、BD [I])。
} 

のInt メイン(){ 
    freopenは(" in.txt "" R&LT " 、STDIN); 
    
    文字列STR1、STR2、
    CIN >> 0009のSTR2;   // 書き込み文字列オブジェクトまたはCINと>>文字列とCOUT < <文字列、scanf関数を使用しないで、printfの、そうでなければ問題がある 
    bign B1 = to_bign(0009); 
    bign B2 = to_bign(STR2)は、

    部門(B1、B2); 
    print_bign(result_n); 
    のprintf("    " ); 
    print_bign(remain_n) ; 
    
    戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/chuan-chuan/p/11498452.html