#递归分治#2的幂次#acwing#上交机试题

acwing链接https://www.acwing.com/problem/content/3486/

思路:读取m后,将m在实际内存中存储的01串为1的位数压入动态数组exp中,同时维护一个字符串res用来保存输出结果。想要得到最终正确的字符串,需要返回类型为string的函数处理:

1.加号+在每次用于遍历的i不为0的时候拼接到res后(可以避免算式结束之后多余+)

2.若exp[i]等于1,则直接拼接2即可,没有其他项(类似于递归起始的数据)

3.若exp[i]不等于1;则先拼接(2,再调用函数获取子串,再拼接),保持格式正确

4.0的问题:若传入的整形参数为0,则直接打印一个0;

完成后,用while!=EOF处理多个输入并换行依次输出res内容即可

/*每个正数都可以用指数形式表示。
例如,137=27+23+20。让我们用 a(b)来表示 ab。那么 137可以表示为 2(7)+2(3)+2(0)。
因为 7=22+2+20,3=2+20,所以 137最终可以表示为 2(2(2)+2+2(0))+2(2+2(0))+2(0)。
给定一个正数 ,请你将 n表示为只包含 0和 2的指数形式。
输入格式
输入包含多组数据。每组数据占一行,一个正数 n。
输出格式
每组数据输出一行,一个指数形式表示。
数据范围
1≤n≤20000,每个输入最多包含 100组数据。
输入样例:
1315
输出样例:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)*/

#include <iostream>
#include <cstdio>
#include <vector>
#include <string>

using namespace std;
string Gets2sExponet(int n){
    if(n==0){
        return "0";
    }
    vector<int> exp;
    for(int i=15;i>=0;i--){
        if((n&(1<<i)) != 0){
            exp.push_back(i);
        }
    }
    string res="";
    for(int i=0;i<exp.size();i++){
        if(i!=0){
            res+="+";
        }
        if(exp[i]==1){
            res+="2";
        }
        else{
            res+="2("+ Gets2sExponet(exp[i])+")";
        }
    }return res;
}
int main(){
    int m;
    while(scanf("%d",&m)!=EOF){
        printf("%s\n", Gets2sExponet(m).c_str());
    }
    return 0;
}

全部评论

相关推荐

02-23 19:27
门头沟学院 Java
点赞 评论 收藏
分享
02-23 00:10
湖南大学 C++
点赞 评论 收藏
分享
26牛牛不会梦到感谢信:羡慕离职了还能吃吗现在就赶回去
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务