AtCoderのABC    次のABCの問題へ    前のABCの問題へ

ABC105-C Base -2 Number


問題へのリンク


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "InputX";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("-9");
            //1011
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("123456789");
            //11000101011001101110100010101
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("0");
            //0
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        long N = long.Parse(InputList[0]);

        Console.WriteLine(Solve(N));
    }

    // -2進数にしたstring型を返す
    static string Solve(long pN)
    {
        var ModList = new List<long>();
        long CopiedVal = pN;

        do {
            if (CopiedVal % (-2) == 0) {
                ModList.Add(0);
                CopiedVal /= (-2);
            }
            else {
                ModList.Add(1);
                CopiedVal = (CopiedVal - 1) / (-2);
            }
        } while (Math.Abs(CopiedVal) > 0);

        ModList.Reverse();
        var sb = new System.Text.StringBuilder();
        ModList.ForEach(X => sb.Append(X));
        return sb.ToString();
    }
}


解説

絶対値が0になるまで、マイナス2で割って
余りを逆順で記載すれば、
マイナス2進数での表現になります。

10進数を2進数に変換する方法と似た感じですね。