一道面试题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值