码迷,mamicode.com
首页 > 编程语言 > 详细

c++2的幂次方

时间:2019-06-12 23:16:08      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:返回   name   进一步   print   拆分   一个   预处理   turn   clu   

c++2的幂次方?

题目描述

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

同时约定用括号来表示方次,即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) 

2

的次幂降次排列。

输入

正整数n(n<=20000)

输出

用0,2表示符合约定的n(在表格中不能有空格)。

样例输入

137

样例输出

2(2(2)+2+2(0))+2(2+2(0))+2(0)

代码解释

#include <bits/stdc++.h>
#include <stdio.h>
using namespace std;
int n;
int a[17];
void work(int x)
{
    if (x == 0)
    {
        printf("0"); 
        return ;
    }
    if (x == 2)
    {
        printf("2");
        return ;
    }
/*          x等于0或者2的时候就不可以拆分,直接返回原值       */ 
    while (1)
    {
        int i;
        for (i=16;a[i]>x;i--);//重点    找出小于x的最大2次幂  
        if (a[i] != 2)
        {
            printf("2(");
            work (i);//递归    继续拆分 
            printf(")");
        }
        else
        {
            printf("2"); 
        }
        if (x - a[i]) printf("+"),x = x - a[i];//拆分完大的部分后仍有剩余,继续拆分小的部分 
        else return ;//拆分完就退出  
    }
}
int main()
{
    a[0] = 1;
    for (int i = 1;i <= 16;i ++) a[i] = a[i - 1] * 2;
/*                  预处理出2的1-16次幂                                        */
    scanf("%d",&n);
    work (n);
}

c++2的幂次方

标签:返回   name   进一步   print   拆分   一个   预处理   turn   clu   

原文地址:https://www.cnblogs.com/LJA001162/p/11013096.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!