zoukankan      html  css  js  c++  java
  • XidianOJ 1024 2的幂次表示

    题目描述

    任何一个正整数都可以用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 (2^1用2表示)
    3=2+2^0
    所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
    又如:1315=2^10+2^8+2^5+2+1
    所以1315最后可表示为:2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

    输入

    多组,每行一个正整数(0<n<=20000)

    输出

    每组一行,符合约定的n的0,2表示(在表示中不能有空格)

    --正文
    递归解决
    首先将数变成二进制
    分以下情况解决
      幂次为1
      幂次大于2 递归该幂次
      幂次为2或0
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define SIZE 20
    int Solve(int n){
        int k[20];
        int total = 0,temp = n;
        while (temp > 1){
            total ++;
            k[total] = temp % 2;
            temp /= 2; 
        }
        if (temp == 1){
            total ++; k[total] = 1;
        }
        int last; 
        int i;
        for (i=1;i<=total;i++){
            if (k[i] == 1){
                last = i;
                break;
            }
        }
    
        for (i=total;i>=1;i--){
            if (k[i] == 0) continue;
            int now = i-1;
            if (now == 1){
                printf("2");
                
            }
            else {
                printf("2(");
                if (now >= 3) Solve(now);
                else printf("%d",now);
                printf(")");
            }
            if (i != last){
                printf("+");
            }
        }
    }
    
    int main(){
        int n;
        while (scanf("%d",&n) != EOF){
            Solve(n);
        }
        return 0;
    }
     
  • 相关阅读:
    python
    car-travel project
    数据库
    kafka笔记
    cloudera笔记
    上课笔记
    structured streaming
    SparkSQL
    流数据
    spark厦门大学
  • 原文地址:https://www.cnblogs.com/ToTOrz/p/6127160.html
Copyright © 2011-2022 走看看