C ++ 14整数リテラルを解析します


27

http://en.cppreference.com/w/cpp/language/integer_literalによると、整数リテラルは10進数/ 16進数/ 8進数/バイナリリテラルとオプションの整数接尾辞で構成されます。このチャレンジでは使用されません。

10進リテラルはa non-zero decimal digit (1, 2, 3, 4, 5, 6, 7, 8, 9), followed by zero or more decimal digits (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)です。

8進リテラルはthe digit zero (0) followed by zero or more octal digits (0, 1, 2, 3, 4, 5, 6, 7)です。

16進リテラルはthe character sequence 0x or the character sequence 0X followed by one or more hexadecimal digits (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C, d, D, e, E, f, F)(大文字と小文字を区別しないことに注意してくださいabcdefx)。

バイナリリテラルはthe character sequence 0b or the character sequence 0B followed by one or more binary digits (0, 1)です。

さらに、オプションで'数字の区切り文字としてs が存在する場合があります。それらには意味がなく、無視できます。

入力

C ++ 14整数リテラルまたはその文字コードの配列を表す文字列。

出力

基数10の入力文字列で表される数値。末尾にオプションの改行があります。正しい出力が2 * 10 ^ 9を超えることはありません

受賞基準

GCCの貢献者はこれを行うために500行以上のコードを必要とするため、コードはできるだけ短くする必要があります!

テストケース:

0                       ->    0
1                       ->    1
12345                   ->    12345
12345'67890             ->    1234567890
0xFF                    ->    255
0XfF                    ->    255
0xAbCdEf                ->    11259375
0xa'bCd'eF              ->    11259375
0b1111'0000             ->    240
0b0                     ->    0
0B1'0                   ->    2
0b1                     ->    1
00                      ->    0
01                      ->    1
012345                  ->    5349
0'123'4'5               ->    5349


4
@LuisfelipeDejesusMunozいいえ; それがどのように解析されると予想しましたか?
私の代名詞は

1
単純にC ++ 14で関数を書くことは不正行為だと思いますか?コンパイラが既に自動的に実行しているため(内部的に500行以上のコードであっても...)
Darrel Hoffman

5
@DarrelHoffmanただし、「C ++ 14の関数」でそれを行うことはできません。文字列入力を受け取らないからです。たぶん、C ++コンパイラーを起動するスクリプトを使用します。
アシュプラー

2
この文字列0は、追加するのに適したテストケースかもしれません(最近のリビジョンの1つでバグが明らかになりました)。
ダニエルシェプラー

回答:



22

x86(32ビット)マシンコード、 59 57バイト

この関数はesi、nullで終わる文字列へのポインターとして受け取り、の値を返しますedx。(以下のリストは、AT&T構文でのGAS入力です。)

        .globl parse_cxx14_int
        .text
parse_cxx14_int:
        push $10
        pop %ecx                # store 10 as base
        xor %eax,%eax           # initialize high bits of digit reader
        cdq                     # also initialize result accumulator edx to 0
        lodsb                   # fetch first character
        cmp $'0', %al
        jne .Lparseloop2
        lodsb
        and $~32, %al           # uppercase letters (and as side effect,
                                # digits are translated to N+16)
        jz .Lend                # "0" string
        cmp $'B', %al           # after '0' have either digit, apostrophe,
                                # 'b'/'B' or 'x'/'X'
        je .Lbin
        jg .Lhex
        dec %ecx
        dec %ecx                # update base to 8
        jmp .Lprocessdigit      # process octal digit that we just read (or
                                # skip ' if that is what we just read)   
.Lbin:
        sub $14, %ecx           # with below will update base to 2
.Lhex:
        add $6, %ecx            # update base to 16
.Lparseloop:
        lodsb                   # fetch next character
.Lparseloop2:
        and $~32, %al           # uppercase letters (and as side effect,
                                # digits are translated to N+16)
        jz .Lend
.Lprocessdigit:
        cmp $7, %al             # skip ' (ASCII 39 which would have been
                                # translated to 7 above)
        je .Lparseloop
        test $64, %al           # distinguish letters and numbers
        jz .Lnum
        sub $39, %al            # with below will subtract 55 so e.g. 'A'==65
                                # will become 10
.Lnum:
        sub $16, %al            # translate digits to numerical value
        imul %ecx, %edx
#        movzbl %al, %eax
        add %eax, %edx          # accum = accum * base + newdigit
        jmp .Lparseloop
.Lend:
        ret

また、バイトカウントを使用した逆アセンブリ-今回はIntelフォーマットで、必要に応じて。

Disassembly of section .text:

00000000 <parse_cxx14_int>:
   0:   6a 0a                   push   0xa
   2:   59                      pop    ecx
   3:   31 c0                   xor    eax,eax
   5:   99                      cdq    
   6:   ac                      lods   al,BYTE PTR ds:[esi]
   7:   3c 30                   cmp    al,0x30
   9:   75 16                   jne    21 <parse_cxx14_int+0x21>
   b:   ac                      lods   al,BYTE PTR ds:[esi]
   c:   24 df                   and    al,0xdf
   e:   74 28                   je     38 <parse_cxx14_int+0x38>
  10:   3c 42                   cmp    al,0x42
  12:   74 06                   je     1a <parse_cxx14_int+0x1a>
  14:   7f 07                   jg     1d <parse_cxx14_int+0x1d>
  16:   49                      dec    ecx
  17:   49                      dec    ecx
  18:   eb 0b                   jmp    25 <parse_cxx14_int+0x25>
  1a:   83 e9 0e                sub    ecx,0xe
  1d:   83 c1 06                add    ecx,0x6
  20:   ac                      lods   al,BYTE PTR ds:[esi]
  21:   24 df                   and    al,0xdf
  23:   74 13                   je     38 <parse_cxx14_int+0x38>
  25:   3c 07                   cmp    al,0x7
  27:   74 f7                   je     20 <parse_cxx14_int+0x20>
  29:   a8 40                   test   al,0x40
  2b:   74 02                   je     2f <parse_cxx14_int+0x2f>
  2d:   2c 27                   sub    al,0x27
  2f:   2c 10                   sub    al,0x10
  31:   0f af d1                imul   edx,ecx
  34:   01 c2                   add    edx,eax
  36:   eb e8                   jmp    20 <parse_cxx14_int+0x20>
  38:   c3                      ret    

そして、あなたがそれを試してみたい場合、私がそれにリンクしたC ++テストドライバコードは次のとおりです(GCC asm構文の呼び出し規約仕様を含む):

#include <cstdio>
#include <string>
#include <iostream>

inline int parse_cxx14_int_wrap(const char *s) {
    int result;
    const char* end;
    __asm__("call parse_cxx14_int" :
            "=d"(result), "=S"(end) :
            "1"(s) :
            "eax", "ecx", "cc");
    return result;
}

int main(int argc, char* argv[]) {
    std::string s;
    while (std::getline(std::cin, s))
        std::printf("%-16s -> %d\n", s.c_str(), parse_cxx14_int_wrap(s.c_str()));
    return 0;
}

Peter Cordesのコメントによる-1バイト

10を8に変更するために2つのデクリメントを使用するために、更新から-1バイト


1
オーバーフローのテストが欠落しているのは、...コンパイラによって報告される数値が大きすぎる場合です。
アレクシスウィルク

2
あなたのレジスタの使用入れ替えることができますrdxし、RBX ? Then you can use 1-byte cdq`がゼロにrdxからeax
ピーターコーデス

1
これは、アセンブリのバイト数をリストするか、59バイトのx86マシンコードとしてラベル付けする必要があります。
ポテト44

2
@PeterCordesありがとう、それについて知らなかった。(また、もう一度見てみると、ベースを10から8に変更すると、3バイトの代わりに2バイト-2つのデクリメント命令から-になります。)
Daniel Schepler

3
@AlexisWilkeまた、コンパイラが行う無効な形式(指定されたベースの範囲外の数字など)についてもテストしません。しかし、問題のステートメントによると、入力は有効であり、32ビット符号付き整数をオーバーフローしないことが保証されています。
ダニエルシェプラー

12

JavaScript(Babelノード)、26バイト

笑x2

_=>eval(_.split`'`.join``)

オンラインでお試しください!


4
これはBabelJS専用ではなく、ES6以降で動作します
Bassdrop Cumberwubwubwub

1
@BassdropCumberwubwubwub、ヘッダーはおそらくTIOからコピーされました。
シャギー

ニース、最初に使用しようとしたのはNumber、バイナリと16進数を処理するためですが、明らかに8進数ではないためですNumber("010") === 10
Carl Walsh

7

C ++(gcc)、 141 138 134 120バイト

これは、文字の配列(開始と終了へのポインターのペアとして指定-イテレーターのイディオムのペアを使用)を受け取り、数値を返す関数です。関数が入力配列を変更することに注意してください。

(これは、gcc / libstdc ++の動作に依存して#include<cstdlib>おり、関数もグローバルスコープに配置されます。厳密に標準に準拠したコード#include<stdlib.h>の場合は、もう1文字のコストで置き換えます。)

簡単な説明:コードは最初に文字(ASCII 39)std::removeを除外するために使用します'。次いで、strtol0のベースは既に10進数、8進数、16進数のケースを処理すると、かどうかを確認するための唯一の他の場合は、先行しているように、0bまたは0Bそうであれば、の基本設定strtol2へとつながる2つの文字の後に解析を開始。

#import<algorithm>
#import<cstdlib>
int f(char*s,char*e){e=s[*std::remove(s,e,39)=1]&31^2?s:s+2;return strtol(e,0,e-s);}

オンラインでお試しください。


ceilingcatによる提案とそれに続くいくつかのゴルフにより、3バイトを節約しました。

grastropnerによる提案により、4バイトを節約しました。

-2バイト、ルーカス

l4m2で-12バイト



組み込まれた、ありがとう。
ダニエルシェプラー


無効な入力が未定義の動作である場合、1番目の文字が0基数2
l4m2

その124
l4m2



4

R79 71 69バイト

`+`=strtoi;s=gsub("'","",scan(,""));na.omit(c(+s,sub("..",0,s)+2))[1]

オンラインでお試しください!

strtoiは、ベース2の変換とを無視する以外のすべてを実行します。そのため、'これらの問題を修正するためだけの非常に多くのバイトがあります。

-6バイトのアーロン・ヘイマンに感謝し、さらに-4バイトを刺激します(そして数えます!)

すべてのテストケースを検証する(旧バージョン)


交換バイト保存することができますsub("0b|B"でのsub("b|B"先頭の「0」の値に影響を与えないので、。名前を変更して別のものを取得できますstrtoi
アーロンヘイマン


1
@AaronHaymanうわー、私はna.omit前に見たことがありません。ここはとても便利で、もう少しゴルフをしました:-)
ジュゼッペ

1
最初の失敗がすべてstrtoiバイナリであると想定する場合、別のバイトを保存するsubstring代わりに使用できます。オンラインで試してください!sub
アーロンヘイマン

1
@AaronHayman では、s使用する最初の2文字を削除できますが、sub代わりにsub('..','',s)もう1バイト短くなります!
ジュゼッペ

4

05AB1E16 14バイト

Grimyのおかげで2バイト節約

''KlÐïK>i8ö}.E

オンラインでお試しください! またはテストスイートとして

説明

''K                # remove "'" from input
   l               # and convert to lower-case
    Ð              # triplicate
     ï             # convert one copy to integer
      K            # and remove it from the second copy
       >i  }       # if the result is 0
         8ö        # convert from base-8 to base-10
            .E     # eval


そして、ここに偽の13があります(すべてのテストケースに合格しますが、例えば失敗します0010)。
グリムミー

@Grimy:ありがとう!のクールな使用ï
エミグナ

4

Excel、115バイト

=DECIMAL(SUBSTITUTE(REPLACE(A1,2,1,IFERROR(VALUE(MID(A1,2,1)),)),"'",),VLOOKUP(A1,{"0",8;"0B",2;"0X",16;"1",10},2))

A1からの入力、この式を配置した場所への出力。配列式なので、Ctrl+ Shift+ Enterを使用して入力します。

画像に見ることができるいくつかのテストケースを追加しました。いくつかの初期の試みでは、与えられたすべてのテストケースを正しく処理しましたが、行16および/または17が間違っていました。

ここに画像の説明を入力してください


最後の2つの閉じ括弧を省略し、「コンパイラ」(リターンまたはタブを押す)がエラーを訂正するという事実を利用するのは規則に反しますか?
ルーカス

私の意見では、はい。サイトのコンセンサスはないと思います。かっこを追加するExcelは、別の言語のIDEのコード補完機能に相当するように感じられますが、バイトカウントでは無視する必要があります。(しかし、静かに「PRINT」に展開されるにもかかわらず、「?」はBASICで1バイトとしてカウントされるべきだと思うので、ここでは完全に一貫性がないかもしれません)。
ソフィア・レヒナー

3

x86-64マシンコード、44バイト

(同じマシンコードは32ビットモードでも機能します。)

@Daniel Scheplerの答えは、このための開始点だったが、これは少なくとも一つの新しいアルゴリズムの考え方(同じ考えのより良いゴルフだけではなく)がありますのためのASCIIコード'B'1000010)をし、'X'1011000)でマスキングした後、16と2を与えます0b0010010

したがって、10進数(先頭のゼロ以外の数字)と8進数(後の文字'0'がより小さい)を除外した後'B'、base = c & 0b0010010を設定して数字ループにジャンプするだけです。

x86-64 System Vで呼び出し可能としてunsigned __int128 parse_cxx14_int(int dummy, const char*rsi);unsigned __int128結果の上位半分からEDX戻り値を抽出しtmp>>64ます。

        .globl parse_cxx14_int
## Input: pointer to 0-terminated string in RSI
## output: integer in EDX
## clobbers: RAX, RCX (base), RSI (points to terminator on return)
parse_cxx14_int:
        xor %eax,%eax           # initialize high bits of digit reader
        cdq                     # also initialize result accumulator edx to 0
        lea 10(%rax), %ecx      # base 10 default
        lodsb                   # fetch first character
        cmp $'0', %al
        jne .Lentry2
    # leading zero.  Legal 2nd characters are b/B (base 2), x/X (base 16)
    # Or NUL terminator = 0 in base 10
    # or any digit or ' separator (octal).  These have ASCII codes below the alphabetic ranges
    lodsb

    mov    $8, %cl              # after '0' have either digit, apostrophe, or terminator,
    cmp    $'B', %al            # or 'b'/'B' or 'x'/'X'  (set a new base)
    jb   .Lentry2               # enter the parse loop with base=8 and an already-loaded character
         # else hex or binary. The bit patterns for those letters are very convenient
    and    $0b0010010, %al      # b/B -> 2,   x/X -> 16
    xchg   %eax, %ecx
    jmp  .Lentry

.Lprocessdigit:
    sub  $'0' & (~32), %al
    jb   .Lentry                 # chars below '0' are treated as a separator, including '
    cmp  $10, %al
    jb  .Lnum
    add  $('0'&~32) - 'A' + 10, %al   # digit value = c-'A' + 10.  we have al = c - '0'&~32.
                                        # c = al + '0'&~32.  val = m+'0'&~32 - 'A' + 10
.Lnum:
        imul %ecx, %edx
        add %eax, %edx          # accum = accum * base + newdigit
.Lentry:
        lodsb                   # fetch next character
.Lentry2:
        and $~32, %al           # uppercase letters (and as side effect,
                                # digits are translated to N+16)
        jnz .Lprocessdigit      # space also counts as a terminator
.Lend:
        ret

変更されたブロックとダニエルのバージョンは、(ほとんど)他の命令よりもインデントが少なくなっています。また、メインループの下部には条件分岐があります。どちらのパスもそのトップに落ちないため、これはニュートラルな変更であることdec ecx / loop .Lentryが判明し、ループに入るためのアイデアは、8進数を異なる方法で処理した後は勝てないことが判明しました。しかし、ループ内のイディオム形式のループdo {} while構造を使用すると、ループ内の命令が少なくなるため、そのままにしました。

ダニエルのC ++テストハーネスは、32ビットの回答と同じ呼び出し規約を使用するこのコードを使用して、64ビットモードで変更せずに動作します。

g++ -Og parse-cxx14.cpp parse-cxx14.s &&
./a.out < tests | diff -u -w - tests.good

実際の答えであるマシンコードバイトを含む逆アセンブリ

0000000000000000 <parse_cxx14_int>:
   0:   31 c0                   xor    %eax,%eax
   2:   99                      cltd   
   3:   8d 48 0a                lea    0xa(%rax),%ecx
   6:   ac                      lods   %ds:(%rsi),%al
   7:   3c 30                   cmp    $0x30,%al
   9:   75 1c                   jne    27 <parse_cxx14_int+0x27>
   b:   ac                      lods   %ds:(%rsi),%al
   c:   b1 08                   mov    $0x8,%cl
   e:   3c 42                   cmp    $0x42,%al
  10:   72 15                   jb     27 <parse_cxx14_int+0x27>
  12:   24 12                   and    $0x12,%al
  14:   91                      xchg   %eax,%ecx
  15:   eb 0f                   jmp    26 <parse_cxx14_int+0x26>
  17:   2c 10                   sub    $0x10,%al
  19:   72 0b                   jb     26 <parse_cxx14_int+0x26>
  1b:   3c 0a                   cmp    $0xa,%al
  1d:   72 02                   jb     21 <parse_cxx14_int+0x21>
  1f:   04 d9                   add    $0xd9,%al
  21:   0f af d1                imul   %ecx,%edx
  24:   01 c2                   add    %eax,%edx
  26:   ac                      lods   %ds:(%rsi),%al
  27:   24 df                   and    $0xdf,%al
  29:   75 ec                   jne    17 <parse_cxx14_int+0x17>
  2b:   c3                      retq   

ダニエルのバージョンからのその他の変更には、区切り文字の検出の一部としての代わりにsub $16, %almoreを使用することによる数字ループ内からの保存、および数字とアルファベット文字が含まれます。subtest

ダニエルのすべての文字とは異なり、以下のすべての文字'0'は、単なる区切り記号ではなく区切り記号として扱われ'\''ます。(例外' '::両方のループでand $~32, %al/ jnzはスペースをターミネータとして扱います。これは、行の先頭で整数を使用してテストする場合に便利です。)

%alループ内で変更するすべての操作には、結果によって設定されるフラグを消費するブランチがあり、各ブランチは異なる場所に移動します(またはフォールスルーします)。


eax宛先が小さい64ビットモードのオペコードでAIUIが上位ビットを0にリセットする場合、初期化が必要ですか?
ダニエルシェプラー

@Daniel:32ビットのレジスタを書き込むと、64ビットにゼロ拡張されます。8ビットまたは16ビットのレジスタを書き込むと、他のモードからの動作が維持されます。つまり、既存の値にマージされます。AMD64は、8ビットおよび16ビットのレジスタの誤った依存関係を修正せず、に変更setcc r/m8しなかったため、32/64ビットの0または1を作成するsetcc r/m32ために、愚かな2命令xor-zero / set flags / setcc %alsequenceが必要です。変数。フラグ設定の前にゼロ化されたレジスタが必要です。(または、mov $0, %eax代わりに使用movzxするか、クリティカルパスで使用します)。
ピーターコーデス

1

網膜、96バイト

T`'L`_l
\B
:
^
a;
a;0:x:
g;
a;0:b:
2;
a;0:
8;
[a-g]
1$&
T`l`d
+`;(\d+):(\d+)
;$.($`*$1*_$2*
.+;

オンラインでお試しください!リンクにはテストスイートが含まれます。説明:

T`'L`_l

'sを削除し、すべてを小文字に変換します。

\B
:

16進数を10進数に変換する必要があるため、数字を区切ります。

^
a;
a;0:x:
g;
a;0:b:
2;
a;0:
8;

数値の基数を特定します。

[a-g]
1$&
T`l`d

文字a-gを数字に変換します10-16

+`;(\d+):(\d+)
;$.($`*$1*_$2*

数字のリストでベース変換を実行します。$.($`*$1*_*$2*$.($`*$1*_*$2*_)乗算$`して$1一緒にして加算するための短いです$2。(つまり、ベースの$`前の文字列の部分です;。)

.+;

ベースを削除します。


コードを説明するために取ったリテラルプログラミングアプローチに感謝します:-)
grooveplex


1

Perl 6、29バイト

{+lc S/^0)>\d/0o/}o{S:g/\'//}

オンラインでお試しください!

Perl 6では、0o8進数に明示的なプレフィックスが必要であり、のような大文字のプレフィックスはサポートしていません0X

説明

                   {S:g/\'//}  # remove apostrophes
{                }o  # combine with function
     S/^0)>\d/0o/    # 0o prefix for octal
  lc  # lowercase
 +    # convert to number

1

オクターブ29 21 20バイト

@(x)str2num(x(x>39))

オンラインでお試しください!

@TomCarpenterのおかげで-8バイト


22バイトの場合:@(x)str2num(x(x~="'"))
トムカーペンター

21バイトの場合:@(x)str2num(x(x~=39))
トムカーペンター

Octalは動作していないようです(少なくともTIOでは)。たとえば、63になるはずのときにf=("077")戻りますans = 77。または、OPのテストケースのようにf=("012345")5349を返す必要がありますが、代わりにans = 12345
brhfl

1

Bash、33バイト

x=${1//\'};echo $[${x/#0[Bb]/2#}]

TIO

Zsh、29 27バイト

@GammaFunctionのおかげで-2バイト

<<<$[${${1//\'}/#0[Bb]/2#}]

TIO


賢い!setopt octalzeroesZshには必要だと思っていたでしょう。
GammaFunction

あなたはとZshの中で2つのバイトを保存することができます<<<$[...]代わりにecho $[...]
GammaFunction

おかげで、私はリダイレクトとzshの空のコマンドは、出力を表示することができることを知らなかった、私はzshのについて多くを知らない、私はかなり良くbashのを知っている
ナウエルFouilleul

bashは0から8進数の先頭の数字を自動的に解釈し、たとえば日付/時刻で削除する必要があることを知っていました
Nahuel Fouilleul

0

ゴー、75

import "strconv"
func(i string)int64{n,_:=strconv.ParseInt(i,0,0);return n}

これは、バイナリリテラルや一重引用符の数字区切り文字では機能しないようです。
ニックマッテオ

やばい。すぐに修正します。区切り文字を完全に忘れてしまった
vityavv

0

JavaScript(ES6)、112バイト

n=>+(n=n.toLowerCase().replace(/'/g,""))?n[1]=="b"?parseInt(n.substr(2),2):parseInt(n,+n[0]?10:n[1]=="x"?16:8):0







0

C ++、G ++、189バイト

#include<fstream>
#include<string>
void v(std::string s){{std::ofstream a("a.cpp");a<<"#include<iostream>\nint main(){std::cout<<"<<s<<";}";}system("g++ -std=c++14 a.cpp");system("a.exe");}

テスト不要

のインストールが必要 g++C ++ 14サポート付きの

今、説明:

というファイルを書き込み、a.cppGCCを使用してコンパイルし、数値を出力するファイルを提供します




0

C(gcc)/ Bash / C ++、118バイト

f(i){asprintf(&i,"echo \"#import<iostream>\nmain(){std::cout<<%s;}\">i.C;g++ i.C;./a.out",i);fgets(i,i,popen(i,"r"));}

オンラインでお試しください!


私はいくつかのコードをゴルフしました。それから、私はそれが動作する理由がまったくないことに気づきましたが、動作するようです。158バイト
私の代名詞は

@誰か、それは厄介ですが、私はそれが好きです!
ヨハンデュトワ

148は、マージしてバイトpopensystem。G ++には、-xstdinから読み取るためのフラグがあります。これは、fopenのものよりも短いかもしれないが、私はCで標準入力で起動する方法がわからない
私の代名詞はmonicareinstateで

@someone、すべてがpopenコマンドにマージされました
Johan du Toit

printf->動作してechoいるようです。すぐにbashでプログラミングすることになります。
私の代名詞は

0

Java、 158 154バイト

これはただアウトゴルフされるのを待っています。正常に動作し、デフォルトで16進数になるまで正規表現を試行します。
@ValueInkのおかげで-4バイト

n->{n=n.replace("'","");var s=n.split("[bBxX]");return Long.parseLong(s[s.length-1],n.matches("0[bB].+")?2:n.matches("0\\d+")?8:n.matches("\\d+")?10:16);}

オンラインで試す

ScriptEngineの使用、92 87バイト

通過する評価列車。技術的には、これはトーチをJSに渡すため、メインの提出ではありません。

n->new javax.script.ScriptEngineManager().getEngineByName("js").eval(n.replace("'",""))

TIO


を使用[bBxX]して0[bB].+、いくつかの迅速な正規表現最適化を行います。
バリューインク

@ValueInkありがとう
ベンジャミンアー

これは整数ではなく、Longです。タイトルは明らかに整数です。IEEE754en.wikipedia.org/ wiki/の小数点以下の桁数のために、単精度または倍精度のIEEE754は数値を保存するために使用される方法により不正確になる可能性があります。IEEE_754#Roundings_to_nearest、2兆を超える数もサポートします(0x9999999999
Martin Barker

@MartinBarker LongInteger、ゴルフの代わりに使用することを許可されています。また、正しい場合、Pythonは事実上任意精度の整数を持っているため、競合することはできません。また、longJavaのa は32ビットではなく64ビットで表される整数です。小数点以下の桁はありません。
ベンジャミンアーカート

長いことは、整数ではなく長いを使用しているだけで、ゴルフの目的について間違っている、The correct output never will exceed 2*10^9それは私がそれ0x9999999999を与えることができ、それが数字を生成するので、その長いことを単独で使用できないことを意味する高い2 *あなたがこの番号にメモリの32ビットのみが割り当てられているとき、それはあなたのメモリが32ビット以上を使用しているため、メモリのオーバーフローの問題を作成しますC ++のに対し、10 ^ 9
マーティン・バーカー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.