实现一个函数,对一个正整数n,算得到1需要的最少操作次数:
如果n为偶数,将其处以2; 如果n为奇数,可以加1或减1; 一直处理下去。
例子:
ret = func(7);
ret = 4,可以证明最少需要4次运算
n = 7
n—1 6
n/2 3
n-1 2
n/2 1
要求:实现函数(实现尽可能高效)
Int func(unsign int n);n为输入,返回最小的运算次数。
给出思路(文字描述),完成代码,并分析你算法的时间复杂度。
如果n为偶数,将其处以2; 如果n为奇数,可以加1或减1; 一直处理下去。
例子:
ret = func(7);
ret = 4,可以证明最少需要4次运算
n = 7
n—1 6
n/2 3
n-1 2
n/2 1
要求:实现函数(实现尽可能高效)
Int func(unsign int n);n为输入,返回最小的运算次数。
给出思路(文字描述),完成代码,并分析你算法的时间复杂度。
//第一种实现
int func2(const unsigned int n)
{
if(1 == n)
{
return 0;
}
if(2 == n)
{
return 1;
}
if(n % 2 == 0)
{
return 1 + func2(n / 2);
}
else
{
int plus = func2(n + 1);
int mines = func2(n - 1);
return 1 + (plus < mines ? plus : mines);
}
return 0;
}
//第二种实现
int func3(unsigned long n)
{
if(n == 1)
return 0;
if(n == 3)
return 2;
if(n%2 == 0)
{
return 1 + func3(n/2) ;
}
else
{
if((n+1)%4 == 0)
return 3 + func3((n+1)/4);
if((n-1)%4 == 0)
return 3 + func3((n-1)/4);
}
return 0;
}
int func6(const unsigned int n)
{
if(1 == n)
return 0;
if(3 == n)
return 2;
if(!(n & 0x01))
return 1 + func6(n >> 1);
else
{
if(!((n + 1) & 0x03))
return 3 + func6((n + 1) >> 2);
if(!((n - 1) & 0x03))
return 3 + func6((n - 1) >> 2);
}
return 0;
}
//第三种实现
int func_iterative(unsigned int n)
{
int step = 0;
while(n != 1 && n != 3)
{
if( !(n & 0x01))
{
n >>= 1;
++step;
}
else
{
if(!((n + 1) & 0x03))
{
++n;
++step;
}
else if(!((n - 1) & 0x03))
{
--n;
++step;
}
}
}
if(3 == n)
step += 2;
return step;
}
//最新添加-----实验室大牛的又一改进版本
int func(const unsigned int n)
{
if(1 == n)
{
return 0;
}
if(3 == n)
{
return 2;
}
if(!(n & 0x01))
{
return 1 + func(n >> 1);
}
else
{
return 3 + (!((n + 1) & 0x03) ? func((n + 1) >> 2) : func(n >> 2));
}
return 0;
}