如果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
}