搜索
查看: 732|回复: 2
打印 上一主题 下一主题

一道水题,求解

[复制链接]
跳转到指定楼层
楼主
发表于 2015-12-6 00:55:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pjr 于 2015-12-6 00:57 编辑

Description
对于一个整数,有如下操作规则:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。那么,最终该数会变为1。
例如:当n为7时,可以证明最少需要4次运算
n = 7
n-1 6
n/2 3
n-1 2
n/2 1最终该数会变为1.
现在给出一个整数,求它变为1的最少运算次数。

Input
输出包括多组测试用例,通过EOF结束。
每组测试用例包括一行,为一个整数n(1<=n<=2000000000)。

Output
每组测试用例输出一行,为一个数,即n变为1的最少运算次数。

Sample Input
                                        Copy sample input to clipboard                                    
7
Sample Output
4


感觉这题可以用书中的深度优先算法来解,然而我失败了,求大神帮忙!



沙发
发表于 2015-12-6 14:22:32 | 只看该作者
不是可以用动态规划吗

点评

动规……  详情 回复 发表于 2018-2-27 13:59
板凳
发表于 2017-10-25 21:24:32 | 只看该作者
这样好像可以
[mw_shl_code=c,true]#include <stdio.h>
int main()
{
        int i,n,o;S:
        scanf("%d",&n);o=n;
    if(n<=0){
                printf("请输入正整数!\n\n");
                goto S;
        }for(i=0;o!=1;i++){
                o/=2;}
        for(o=1;i;i--)
                o*=2;
        i=(o/2+o>=n);
        for(o=0;n!=1;o++)
                if(n%2)
                        printf("n%c1=%d\n",
                        i?'-':'+',n+= i?-1:1);
                else
                        printf("n/2=%d\n",n/=2);
        printf("\n需要%d步\n\n\n",o);
        goto S;
}
[/mw_shl_code]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表