/// <summary>
/// Trilogy公司的笔试题
/// 如果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
///
///
///n%4!=3 n++
///n%4!=1 n--
/// </summary>
private void SetData( int n)
{
int X1=0;
int N1=n;
while(n!=1)
{
if(n%2==0)
{
n/=2;
X1++;
}
else
{
if(n%4==1||n==3)
n--;
else
n++;
X1++;
}
}
this.Label1.Text+="<br>"+N1.ToString()+" : "+X1.ToString();
}
/// <summary>
///n%4!=1 n++
///n%4!=3 n--
/// </summary>
/// <param name="n"></param>
private void SetData2( int n)
{
int X1=0;
int N1=n;
while(n!=1)
{
if(n%2==0)
{
n/=2;
X1++;
}
else
{
if(n%4==1)
n++;
else
n--;
X1++;
}
}
this.Label2.Text+="<br>"+N1.ToString()+" : "+X1.ToString();
}
/// <summary>
/// n++
/// </summary>
/// <param name="n"></param>
private void SetData3( int n)
{
int X1=0;
int N1=n;
while(n!=1)
{
if(n%2==0)
{
n/=2;
X1++;
}
else
{
n++;
X1++;
}
}
this.Label3.Text+="<br>"+N1.ToString()+" : "+X1.ToString();
}
/// <summary>
/// n--
/// </summary>
/// <param name="n"></param>
private void SetData4( int n)
{
int X1=0;
int N1=n;
while(n!=1)
{
if(n%2==0)
{
n/=2;
X1++;
}
else
{
n--;
X1++;
}
}
this.Label4.Text+="<br>"+N1.ToString()+" : "+X1.ToString();
}
private void SetNewData()
{
int n,m;
try
{
m=Convert.ToInt32(this.TextBox1.Text);
}
catch
{m=1;}
n=2;
while(n<=m)
{
n++;
this.SetData(n);
this.SetData2(n);
this.SetData3(n);
this.SetData4(n);
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
SetNewData();
}
///this.SetData(n);为现在算出的最佳算法,应该还有更简单的算法吧