challenge LL Golf Hole 6 - 10進数を2進数に基数変換する

与えられた10進数の整数を2進数に変換してください。ただし、与えられる整数は0以上とします。

与える整数についてはリテラルで与える、標準入力で与える、引数で与えるなどは自由とします。

余力のあるものはこのプログラムを短くしてみたり、さまざまな基数への変換に対応させてみてください。

※LL Future実行委員の高野光弘です。この出題は LL Future公式の出題であり、優れたものについてはLL Golfのセッションでご紹介させていただくかもしれません。ご理解の上、ご投稿ください。また、LL Futureのチケットは現在も発売中です。よろしければ、メインイベントの方にもぜひご参加ください。

1
2
# 標準入力から整数を受け取る
ruby -e 'puts gets.to_i.to_s(2)'

Posted feedbacks - C++

2進数限定、桁数固定です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <bitset>
#include <iostream>

int main(int, char* [])
{
    int n;
    std::cin >> n;
    std::cout << std::bitset<32>(n) << std::endl;

    return 0;
}

テンプレートで計算させてみました。

10進数値で表現しているので、基数は10以下で表現できる桁数も少ないです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
template<int R, int N> struct Digit       { static const int value = Digit<R, N/R>::value * 10 + (N%R); };
template<int R>        struct Digit<R, 0> { static const int value = 0; };

#include <iostream>

int main(int, char* [])
{
    std::cout << Digit<2, 10>::value << std::endl; // 2進数で10
    std::cout << Digit<4, 10>::value << std::endl; // 4進数で10
    std::cout << Digit<8, 10>::value << std::endl; // 8進数で10

    return 0;
}

出来る限り少ないコードで書いてみました。

1
2
#include <stdio.h>
main(d){for(scanf("%d",&d);d>0;d>>=1)printf("%d",d&1);}

一つネタを思いついたので、mattsanのを改良(改悪)。 コンパイルできないですが、コンパイルエラーログに答えが出ます。 VC2008で確認。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <boost/static_assert.hpp>

template<int A, int B, int N>
struct Digit { enum { value = Digit<A*10, (N%2)*A+B, N/2>::value }; };

template<int A, int B>
struct Digit<A, B, 0> { BOOST_STATIC_ASSERT(false); };

int main(int, char* [])
{
    Digit<1, 0, 52>::value;        // Nに変換したい値を
    return 0;
}

---- コンパイルログ (Bが答え) ----
1>main.cpp(5) : コンパイルされたクラスの テンプレート のインスタンス化
  'Digit<A,B,N>' の参照を確認してください
1>with
1>[
1>    A=1000000,
1>    B=110100,
1>    N=0
1>]

Index

Feed

Other

Link

Pathtraq

loading...