一道笔试题

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

-----------------------------------------------------------------------------------------

实现1:

int main()
{
    int a[100+1];
    int i;
    a[1]=0;
    for(i=2;i<=100;i++)
    {
           if(i%2==0)
               a[i]=a[i/2]+1;
           else
               if(a[(i+1)/2]>a[(i-1)/2])
                   a[i]=a[(i-1)/2]+2;
               else
                   a[i]=a[(i+1)/2]+2;
           printf("%d %d\n",i,a[i]);
    }
    scanf("%s");
    return 0;
}

实现2:

int i = src;
int count = 0;
while( i > 1)
{
if( i%2==0)
i/=2;
else if( i ==3 )
i--;
else
{
i += (i%4-2);
}
count++;
}
Console.WriteLine( "{0} use times {1}",src,count);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值