描述
任何一个正整数都可以用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)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"
","?“和空格组成,”$“和”?"表示与之对应的左括号和右括号不能匹配。
一开始想用递归来做,可是后来发现用递归会比较麻烦,就用比较传统的方法,输入“(”之后,会有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;
}