一道面试题

来源:互联网 发布:淘宝好店推荐 编辑:程序博客网 时间:2024/04/28 00:22

如果n为偶数,则将它除以2,
如果n为奇数,则将它加1或者减1。
问对于一个给定的n,怎样才能用最少的步骤将它变到1。
例如:
n=   61
n--   60
n/2   30
n/2   15
n++   16
n/2   8
n/2   4
n/2   2
n/2   1 
==== 

public class MyClass
{
private static int step=0;
private static List<string> results = new List<string>();
public static void Main()
{
Calc(99);
RL();
}

public static void PrintSteps()
{
Console.WriteLine("Need "+step.ToString());
for(int i = results.Count-1; i >0 ; i--)
{
Console.WriteLine("Step " + (results.Count-i).ToString() + " : " + results[i]);
}
Console.WriteLine(results[0]);
}

public static void Calc(int intputNumber)
{
step=0;
CalcStep(intputNumber);
PrintSteps();
}

public static void CalcStep(int num)
{
step++;
if(num>3)
{
if(num%2==0)
{
CalcStep(num/2);
results.Add(num.ToString() + @" / 2 = " + (num/2).ToString());
}
else
{
if((num+1)%4==0)
{
CalcStep(num+1);
results.Add(num.ToString() + "++ = " + (++num).ToString());
}

if((num-1)%4==0)
{
CalcStep(num-1);
results.Add(num.ToString() + "-- = " + (--num).ToString());
}
}
}
else
{
switch(num)
{
case 1:
step--;
results.Insert(0,"Number 1 is U need");
break;
case 2:
results.Insert(0," 2 / 2 = 1");
CalcStep(1);
break;
case 3:
results.Insert(0,"3 - 1 = 2");
CalcStep(2);
break;
}
}
}
#region Helper methods

private static void WL(object text, params object[] args)
{
Console.WriteLine(text.ToString(), args);
}

private static void RL()
{
Console.ReadLine();
}

private static void Break()
{
System.Diagnostics.Debugger.Break();
}

#endregion
}

原创粉丝点击