任何一个正整数都可以用2的幂次方表示

例如:137=2^7+2^3+2^0,约定a^b可表示为a(b),则137可表示为:2(7)+2(3)+2(0),进一步7=2^2+2+2^0,3=2+2^0。所以137最终可以表示为2(2(2)+2+2(0))+2(2+2(0))+2(0)。

输入:正整数(n<=20 000).
输出:符合约定的n的0,2表示(在表示中不能有空格)。

算法设计:由于不知道数据的位数,加上对数据还是从低位到高位的操作比较简单,而输出显然是由高位到低位进行的,这是就要考虑用递归机制实现算法了。

//n为操作数,r为递归深度
void fun(int n, int r)
{
    //递归结束
    if (1 == n)
    {
        cout<<"2("<<r<<")";
    }
    else
    {
        //n除以二,递归深度加1
        fun(n/2, r+1);
        //如果模2有余数,则为2^r
        if (1 == n%2)
        {
            cout<<"+2("<<r<<")";
        }
    }
}

经过上面的处理,如果输入fun(137,0),则输出为2(7)+2(3)+2(0)。
这时,如果对7和3递归处理,则为满足题意的输出。如下代码所示:

//n为操作数,r为递归深度
void fun(int n, int r)
{
    //递归结束,最先输出,不带+号
    if (1 == n)
    {
        /*cout<<"2("<<r<<")";*/
        //将r表示成0和2
        switch(r)
        {
            //2^0,递归深度为0
        case 0:cout<<"2(0)";break;
            //2^1,递归深度为1
        case 1:cout<<"2";break;
            //2^2,递归深度为2
        case 2:cout<<"2(2)";break;
            //2^r,递归深度为r
        default:
            cout<<"2(";
            fun(r,0);
            cout<<")";
        }
    }
    else
    {
        //n除以二,递归深度加1
        fun(n/2, r+1);
        //如果模2有余数,则为2^r
        if (1 == n%2)
        {
            /*cout<<"+2("<<r<<")";*/
            /*cout<<"2("<<r<<")";*/
            //将r表示成0和2
            switch(r)
            {
                //2^0,递归深度为0
            case 0:cout<<"+2(0)";break;
                //2^1,递归深度为1
            case 1:cout<<"+2";break;
                //2^2,递归深度为2
            case 2:cout<<"+2(2)";break;
                //2^r,递归深度为r
            default:
                cout<<"+2(";
                fun(r,0);
                cout<<")";
            }
        }
    }
}

经过上面的处理,如果输入fun(137,0),
则输出为2(2(2)+2+2(0))+2(2+2(0))+2(0)。

  • 13
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值