简述:
实现一个函数,对一个正整数n,算得到1需要的最少操作次数:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。
例子:
ret=func(7);
ret=4,可以证明最少需要4次运算
n=7
n-- 6
n/2 3
n-- 2
n/2 1
要求:
实现函数(实现尽可能高效)int func(unsign int n);n为输入,返回最小的运算次数。
给出思路(文字描述),完成代码,并分析你算法的时间复杂度。
请列举测试方法和思路。
基本思路:
x=0, y=z=1的时候+1(此时必须n>3,否则-1)
结论就是:
n%2=0,则f(n)=f(n/2)+1
(n+1)%4=0 && n>3,则f(n)=f(n+1)+1=f((n+1)/4)+3
其他情况,则f(n)=f(n-1)+1=f((n-1)/2)+2
最后,f(1)=0
简单代码如下:
#include<stdio.h>
int function(int n)
{
int i=0;
if(n==1||n==0)
return 0;
if(n%2!=0)
{
if((n-3)%4==0)
n++;
else
n--;
i++;
}
i++;
i+=function(n/2);
return i;
}
void main()
{
int it;
int k;
printf("input the number:");
scanf("%d", &it);
for(k=1;k<=it;k++)
printf("%2d_the result is: %d/n", k, function(k));
}