首页 > 试题广场 >

2的幂次方

[编程题]2的幂次方
  • 热度指数:8673 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
    Every positive number can be presented by the exponential form.For example, 137 = 2^7 + 2^3 + 2^0。     Let's present a^b by the form a(b).Then 137 is presented by 2(7)+2(3)+2(0). Since 7 = 2^2 + 2 + 2^0 and 3 = 2 + 2^0 , 137 is finally presented by 2(2(2)+2 +2(0))+2(2+2(0))+2(0).        Given a positive number n,your task is to present n with the exponential form which only contains the digits 0 and 2.

输入描述:
    For each case, the input file contains a positive integer n (n<=20000).


输出描述:
    For each case, you should output the exponential form of n an a single line.Note that,there should not be any additional white spaces in the line.
示例1

输入

1315

输出

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
#include <stdio.h>
void dfs(int n) {
    int a[20], top, i, flag;
    flag = 0;
    top = -1;
    while (n) {
        a[++top] = n % 2;
        n /= 2;
    }
    for (i = top; i >= 0; i--) {
        if (a[i] == 1) {
            if (flag)    printf("+");
            flag = 1;
            if (i == 0) {
                printf("2(0)");
            } else if (i == 1) {
                printf("2");
            } else if (i == 2) {
                printf("2(2)");
            } else {
                printf("2(");
                dfs(i);
                printf(")");
            }
        }
    }
}

int main() {
    int n;
    scanf("%d", &n);
    dfs(n);
    return 0;
}
发表于 2025-03-14 20:34:15 回复(0)
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX 15               // n<=20000   则2的14次方<n<2的15次方, n的2进制位低于15位

void pow2(int num) {         //所有的数都要分解成最后只剩下 2的0次、2的1次、2的2次 
    int num2[MAX], length = 0;         //num2存储num对应的二进制数
    if (num == 0)             //0代表2的0次幂
        printf("2(0)"); 
    else if (num == 1)        //这里的 1代表2的1次幂
        printf("2");
    else if (num == 2)        //2代表2的2次幂
        printf("2(2)");
    else {                    //这里处理幂>=3 的幂,将这个幂转化为只剩下 2的0次、2的1次、2的2次
        int temp = num, i = 0, j;
        do {                       //计算num的二进制数,存到num2[]里
            num2[i] = temp % 2;
            temp = temp / 2;
            i++;
        } while (temp > 0);
        length = i;

        for (int i = length - 1; i >= 0;i--) {        // 从数组的后面往前计算,因为题目要求从二进制的高位往低位输出
            if (num2[i] == 1) {
                if (i < length - 1)
                    printf("+");            // 最高位之后,若还要输出,则输出一位就先输出一个加号,再输出这一位的字符

                if (i > 2)
                    printf("2(");      //所有大于2的数都要经过再一次的二进制分解,也就是再往小分,那也就需要增加前后括号

                pow2(i);

                if (i > 2)
                    printf(")");

            }
        }
    }
}
int main() {
    int num;
    scanf("%d", &num);
    if (num == 0 || num < 0)
        printf("0");
    else if (num == 1) 
        printf("2(0)");
    else if (num == 2)   
        printf("2");
    else
        pow2(num);
    return 0;
}

发表于 2025-02-28 21:28:53 回复(0)
#include <stdio.h>

void trans(int a){
    if(a==0){
        printf("2(0)");
        return;
    }
    if(a==1){
        printf("2");
        return;
    }
    int stack[15],top=-1,i=0;
    while(a!=0){
        stack[++top]=a%2;
        if(stack[top]!=0) i++;
        a=a/2;
    }
    while(top>-1){
        if(stack[top]!=0){
            i--;
           if(top==0) trans(0);
           else if(top==1) trans(1);
           else{
               printf("2(");
               trans(top);
               printf(")");
            }
            if(i>0) printf("+");
        }
        top--;
    }
}

int main(){
    int a;
    scanf("%d",&a);
    if(a==1) printf("2(0)");
    else if(a==0) printf(0);
    else trans(a);
}
发表于 2022-01-08 23:01:59 回复(0)