題目連結:http://tioj.infor.org/problems/1026
題目的意思是當開始走路後,第一步是一公尺,每次步伐是上一次的兩倍,目標的公尺距離是奇數,並且可以往前和往後走。
每次步伐的距離因為都是2倍,剛好跟二進位的算法是一樣的,不過二進位是用累加方式計算,本題有加有減,但是只要轉換一下想法,因為剛好是兩倍,所以下一步減現在這一步會等於這一步的距離,所以只要把二進位為0的部分變成1,然後右邊一階變成0,就可以跟二進位一樣的算法了。
由於本題輸入是奇數,所以二進位最右邊必定為1可以不必判斷。
string input = Console.ReadLine();
long length = 0;
List<string> direct = new List<string>();
if (Int64.TryParse(input, out length))
{
if(length > 0)
length /= 2;
for (long remainder = length % 2; length > 0; length /= 2, remainder = length % 2)
{
direct.Add(remainder == 0? "-" : "+");
if (length / 2 == 0)
direct.Add("+");
}
Console.WriteLine("{0}\n{1}", direct.Count, string.Join(" ", direct.ToArray()));
}