19递归L、G题

描述
任何一个正整数都可以用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)

首先吧,先判断这个数为“0”,若为“0”则输出“0”, 几乎每一个数的每一个幂都可以由 2(7)+2(3)+2(0)来表示,再看看r的值是多少来判断2()里面的数

#include<bits/stdc++.h>
void put(int num,int n);
int main()
{
    int num;
    cin>>num;
    put(num,0);
}
void put(int m,int n)//m为被分解的数,n为二进制位数,r为位数上的数值。
{
    int r;
    if(m==0)//m已经被分解完,返回
    {
        return;
    }
    r=m%2;
    m=m/2;
    put(m,n+1);
    if(m!=0&&r!=0)
//如果m不为0且r不为0证明这不是第一个2的幂次方,输出+
    {
        printf("+");
    }
    if(r==1)
    {
        if(n==0)
        {
            cout<<"2(0)";
        }
        else if(n==1)
        {
            cout<<"2";
        }
        else if(n==2)
        {
            cout<<"2(2)";
        }
        else
        {
            cout<<"2(";
            put(n,0);//如果指数不能用2(0),2,2(2)表示则继续分解
            cout<<")";
        }
    }
}

描述
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用" " , " ? " . 100 c i n . g e t l i n e ( s t r , 100 ) 99 " "标注,不能匹配的右括号用"?"标注. 输入 输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100 注意:cin.getline(str,100)最多只能输入99个字符! 输出 对每组输出数据,输出两行,第一行包含原始输入字符,第二行由" ","?“和空格组成,”$“和”?"表示与之对应的左括号和右括号不能匹配。
一开始想用递归来做,可是后来发现用递归会比较麻烦,就用比较传统的方法,输入“(”之后,会有m!=0来进行跟踪,看会不会出现“)”,若出现则m=0若不出现,m!=0,并且在下一行的相同列输出“?”,同理可得“)”的做法。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string a;
    while(cin>>a)    //如果有输入,将会一直进行
    {
        int m=0;      //代表左括号的个数
        char b[102];  //用于存储?$‘ ’
        int c[102];   //用于存下左括号的下标值
        int l=a.size();
        for(int i=0;i<l;i++)
        {
            if(a[i]=='(')
            {
                c[m]=i;
                m++;   //左括号的个数+1
                b[i]=' ';
            }
           else if(a[i]==')'&&m<=0)   //前面没有左括号的时候
            {
               b[i]='?';
            }
           else if(a[i]==')'&&m!=0)   //前面有左括号
            {
                m--;
                b[i]=' ';
            }
           else
           {
               b[i]=' ';
           }
        }
        for(int i=0;i<m;i++)
        {
            b[c[i]]='$';
        }
        b[l]='\0';
        cout<<a<<endl;
        cout<<b<<endl;
    }
    return 0;
}
发布了18 篇原创文章 · 获赞 0 · 访问量 200

猜你喜欢

转载自blog.csdn.net/mushuige/article/details/104702200