洛谷题解 P1010 【幂次方】

在我的博客食用效果更佳!https://www.cbw2007.tk/articles/luogu-P1010-sol/,文章最初发表于201975月12日。更多见在不同的网站浏览本站内容

原题链接: P1010 幂次方 - 洛谷 | 计算机科学教育新生态

分析

看各位大佬都用二进制等高端算法,蒟蒻都不会啊!QAQ只好用了最朴素的递归与模拟。

这里要理清这两点:

  1. 在分解一个数时,不能出现重复的,因为 2 x + 2 x = 2 x + 1 2^x+2^x=2^{x+1} 2x+2x=2x+1
  2. 分解出来的幂的指数要尽可能的大。

然后,程序的具体思路是:

  1. 先找一个尽可能大的幂。
  2. 特判,将指数为0和1的单独挑出来输出。
  3. 递归指数。
  4. 减去已经找到的幂次方数,返回第一步。

这样说可能有点迷,上代码更简单!

核心代码

void dfs(int k)//传入一个数
{
    while (k!=0)//如果这个数还没有处理完
    {
        int t=2,i;//指数为1
        for (i=1;t<=k;i++)//指数不断增加,直到当前幂次方已经大于k
            t*=2;
        i--; t/=2;//因为这时候t已经比k大了,所以指数减一
        if (i==0)//如果指数为零
        {
            cout<<"2(0)";
            k-=1;//同k-=t
            goto last;
        }
        if (i==1)//如果指数为一
        {
            cout<<"2";
            k-=2;//同k-=t
            goto last;
        }
        cout<<"2(";
        dfs(i);//递归指数
//		cout<<i;//可以把这一步取消注释,把上一步进行注释,观察指数未分解时是否正确
        cout<<")";
        k-=t;//减去已经找到的幂次方数
        last:
        if (k!=0)
            cout<<"+";//如果k没处理完,输出加号
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值