hex-> decを変換-美しいソリューションを探して

文字列内の数字を見つけるためのアルゴリズムについて議論した後、同じやり方で他のいくつかのタスクを検討するというアイデアが生まれました。 適切な問題は、整数を16進法から10進法に変換することでした。少なくとも1つの明らかなアルゴリズムと、おそらくは多くの非明白なアルゴリズムを備えた、理解しやすい非常に面倒ではありません。







16進法で負でない整数を含む文字列を指定します。 番号は0..9A..Fの数字で書かれており(文字は大きいだけです)、行に数字以外の数字がないことが保証されています。 このような数値の10進表記を含む文字列を取得する必要があります。 入力文字列の長さは100,000バイトを超えません。



あらゆる言語でソリューションを書く-最も美しく、最も短く、最も効果的...チューリングマシンのソリューションでは、「スペース、0、1」(新しいものは入力しない)のみを使用することをお勧めします。 -あなたの裁量で)。 Brainfuckでは、入力文字列を入力し、出力を印刷する必要があります。



UPD。 ビルトインまたはライブラリBigNumを使用することはもちろん良いことですが、どういうわけかあまり面白くありません。 それなしでやりましょう!



シードの場合-C#の解決策(美しい、短い、効果的とも呼ばれない):



        静的な安全でない文字列Hex2Dec(文字列x){
             int l = x.Length;
             int ll = l + l / 4 + 3;
             sbyte [] m =新しいsbyte [ll];
             int i = l;
             foreach(xのchar c)m [-i] =(sbyte)(c <'A'?c-'0 ':c-'A' + 10);
             int lk = ll;
             while(l> 0){
                 int k = 0、l1 = 0;
                 while(l> 0){
                     k =(k << 4)+ m [-l];
                     m [l] =(sbyte)(k / 10);
                     if(l1 == 0 && k> = 10)l1 = l + 1;
                     k%= 10;
                 }
                 m [-lk] =(sbyte)(k + 48);
                 lはl1です。
             }
            文字列res;
            固定(sbyte * c = m){res =新しい文字列(c、lk、ll-lk);  }
            解像度を返す;
         }



All Articles