zzulioj - 2624:Hの小さな奇妙追加

トピックリンク:http://acm.zzuli.edu.cn/problem.php?id=2624

タイトル説明
Hは、特に様々な追加で、アルゴリズムのような非常に小さいです。はい添加は、バイナリ全加算器、セミアディティブなどの多様を含んでいます。
全加算器の2つの入力データビットが追加され、結果の出力とキャリービットは、加算器は、キャリ入力を有します。
半加算器の2つの入力データビットの和は、結果の出力及びキャリービット加算器のキャリー入力は存在しません。XOR演算は半加算器です。Cは、「^」を排他的論理和演算子である
が、10進加算され、一般的に、人々は小数で使用され、デフォルトではすべての小数の桁です。数日前、私は、ADDのスターを行ってきました、小さなHのADDスターが新たに追加を持って聞きました。彼は、ADDの星の世界で見つかった、各番号は、この奇妙で厄介な番号が呼ばれ、すべての六角は異なる可能性が「数を追加します。」例えば、「0687 ...」の最下位ビットを表すことは、7進数である、第2のビットはオクタルの逆数である、3ビットのバイナリ数は6、第4号である10進数である、など。各ビットは、0バイナリまたはd(10進数)、または範囲[2,9]区間内の整数です。理論的にはこれは、集計が与えられていないに、小数であるとみなされ、数字の集計無限の数に含まれなければなりません。
エントリー
まず、最初のタブにNビットの行(0 <N <= 20)、キャリッジリターンで終わります。続いて二列は、各列は、複数の追加のNビットの負でない数以下で与えられます。
輸出
出力の数と行に2つの追加。
サンプル入力  のコピー
7170687 
03236 
445
サンプル出力  のコピー
4104
プロンプト
たとえば、「0687」にタブに相当するが、どのように「3236 + 445」の平均を計算するには?まず、最低レベル計算した:6 + 5 = 11; 7最下位ビットがバイナリ、4であり、我々はキャリーを得るようにするからです。最後から二番目の2:4 + 3 + 1(キャリー)= 8;これは8進数であるため、我々は0とキャリーを得るように。ビット3:4 + 2 + 1(キャリー)= 7; 6我々は1とキャリーを得るように、このビットは、小数であるためです。最初の4つは:3 + 1(キャリー)= 4;我々は7を得るように、このビットは、小数であるためです。最後に、我々が得る:+ 445 = 4104 3236。
 
実際には、変形が大きな整数の加算である、私は別のブログ記事で午前とテンプレートがありました、あなたが参照できる https://www.cnblogs.com/shuitiangong/p/12063528.html
書式#include < 設定 > 
書式#include <マップ> 
書式#include <スタック> 
の#include <キュー> 
の#include <cmath> 
の#include <cstdioを> 
する#include <CCTYPE> 
書式#include < 文字列 > 
の#include <ベクトル> 
の#include <climits> 
#include <CStringの> 
する#include <cstdlib> 
の#include <iostreamの> 
する#include <アルゴリズム>
 の#define MAX(A、B)(> B:B)
 の#define分(A、B)(<B? :B)
 の#define MST()のmemset(0、
sizeof()) の#define_testのprintf( "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \ n "は)
 使用して 名前空間はstdを、
typedefの長い 長いLL。
ペアのtypedef < int型int型 > P;
constの ダブル EPS = 1E- 7 const  int型 INF = 0x3f3f3f3f constの LL ll_INF = 0x3f3f3f3f3f3f3f const  int型 MAXN = 1E3 + 10 チャー LS [ 20 ]。
チャーNUM1 [MAXN]、NUM2 [MAXN]、RES [MAXN]。
アドオン(){// 高精度整数加法(改)
    MST(RES);
    INT LEN1 = STRLEN(NUM1)。
    INT LEN2 = STRLEN(NUM2)。
    INT len3 = STRLEN(LS)。
    逆(NUM1、NUM1 + LEN1)。
    逆(NUM2、NUM2 + LEN2)。
    int型のlen、キャリー。
    LEN =キャリー= 0 以下のためにINT iが= 0 ; iが<LEN1 || I <LEN2; ++ I){ 
        キャリー + = I <LEN1?NUM1 [I] - ' 0 '0 ; 
        運ぶ= I + <LEN2 NUM2 [I] - ?' 0 '0 ;
         IF([LEN3-I- LS 1!] = ' 0 '){ // 非〜9 0 2は、バイナリである 
            RES [LEN =キャリー付き%(LS [LEN3-I- 1 ] - ' 0 ')+ ' 0 ' ; 
            キャリー付き / =(LS [LEN3-I- 1 ] - ' 0 ' ); 
        } 
         { // へプレスに10 0調製 
            RES [LEN]キャリー=%と10 + ' 0 '; 
            キャリー付き / = 10 ; 
        }
         ++ でlen; 
    } 
    IF(キャリー付き)//は、最後に決定carry-ない 
        + =キャリー付きRES [LEN ++] ' 0 ' ; 
    RES [LEN] = 0 ;
     のためにINT I = LEN - 1。 ; I> 0 ;株式会社(www.i-levelmedia.com)){ //はパイロットの注目の影響が直接0 I> = 0、エラーが発生した場合、結果は0に正確に等しいされていない除外
        IF(RES [I] == ' 0 ' 
            RESを[ I] = 0 ;
          
            BREAK ;
    }
    (RES、RES逆 + STRLEN(RES))。
}    
INTメイン(ボイド){ 
    scanf関数(" %S%S%S " 、LS、NUM1、NUM2)。
    追加(); 
    printf(" %sの\ n " 、RES)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/shuitiangong/p/12078740.html