【P1010-幂次方】解题记录

来源:互联网 发布:僧格林沁 知乎 编辑:程序博客网 时间:2024/05/16 12:23

原题点 这里

这是一道简单的分治题,其分治的思路为:

  • 要输出 n 的二进制结果,先提取小于 n 的、最大的 2^m,输出 2^m 的二进制表示,再输出 n-2^m 的二进制表示。
  • 要求 m,可以直接找到 n 的高位 1,它的位数减一即为 m 。
  • 递归边界为 m 为 0 或 1,此时直接输出答案。
  • 注意如果 n-2^m 为 0,就不用输出了,若不是要先输出 “+” 再继续递归。

代码:

#include <cstdio>using namespace std;// 返回小于等于 n 的最大的 2^x 的那个 xint high_bit(int n){    int exp=20;    while(exp>=0){        int flag= 1<<exp;        if(flag&n) return exp;        --exp;    }    return -1; // n 是 0 的情况}void solve(int num){    int exp= high_bit(num), rest= num^(1<<exp); // num^(1<<exp) 等价于 num-(1<<exp)    if(exp==0){ printf("2(0)"); }    else if(exp==1){ printf("2"); }    else{        printf("2(");        solve(exp);        printf(")");    }    if(rest!=0){        printf("+");        solve(rest);    }}int main(){    int input; scanf("%d", &input);    solve(input);    putchar('\n');    return 0;}
原创粉丝点击