• 004:2的幂次方表示


    描述

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

        137=27+23+20

    同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:

        2(7)+2(3)+2(0)

    进一步:7=22+2+20(21用2表示)

            3=2+20

    所以最后137可表示为:

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

    又如:

        1315=210+28+25+2+1

    所以1315最后可表示为:

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

    输入一个正整数n(n≤20000)。输出一行,符合约定的n的0,2表示(在表示中不能有空格)。样例输入

    137

    样例输出

    2(2(2)+2+2(0))+2(2+2(0))+2(0)
    我的代码 WA
    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<string>
    #include<map>
    #define DEBUG(x) cout << #x << " = " << x << endl
    const int  MIN=0x80000000;
    using namespace std;
    int getBit(int n,int i)
    {
        return (n>>i)&1;
    }
    void change(int n)
    {
        if(n==0){
            printf("0");
            return;
        }
        int t=n;
        int cnt=0;
        for(int i=0;t;i++){
            int b=getBit(n,i);
            t=t<<1;
            if(b){
                if((31-i)==2){
                    printf("2");
                    return;
                }
                else {
                printf("2(");
                change(31-i);
                printf(")+");
                cnt++;
                }
            }
        }
        //DEBUG(cnt);
    }
    int main()
    {
        freopen("in.txt","r",stdin);
        int n;
        cin>>n;
        change(n);
        return 0;
    }

    参考代码

    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<string>
    #include<map>
    #define DEBUG(x) cout << #x << " = " << x << endl
    using namespace std;
    int getBit(int n,int i) {
        return (n>>i)&1;
    }
    void change(int n) {
        bool first=true;
        for(int i=15; i>=0; i--) {
            if(getBit(n,i)) {
                if(!first){
                    printf("+");
                }
                else first=false;
                if(i==0) {
                    printf("2(0)");
                } else if(i==1) {
                    printf("2");
                } else {
                    printf("2(");
                    change(i);
                    printf(")");
                }
            }
        }
    }
    int main() {
    //    freopen("in.txt","r",stdin);
        int n;
        cin>>n;
        change(n);
        return 0;
    }

    方向对了,但是怎么也得不到正确的代码,主要是编程思维不够成熟。从上面两份代码,就可以看出来。



  • 相关阅读:
    回档|朴素的网络游戏
    回档|NOIP2010 关押罪犯
    回档|tyvj1091 等差数列
    python lambda 函数
    python map函数
    linux命令清除服务器缓存
    python 类
    距阵的运用
    有一种感动叫ACM(记WJMZBMR在成都赛区开幕式上的讲话)
    C语言strstr()函数:返回字符串中首次出现子串的地址
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9097131.html
Copyright © 2020-2023  润新知