一个c语言编程题,求大神指点啊!!!
发布网友
发布时间:2023-09-04 17:27
我来回答
共5个回答
热心网友
时间:2024-11-04 16:25
#include<string>//C++版本的,下面另一个是C版本的!!!
#include<iostream>
using namespace std;
string expr, ans;
int maxc = -1;
int run(int st, int c)
{
string cur = "";
int i;
for (i = st;i < (int)expr.length();i++)
{
if (expr[i] == '(')
{
i = run(i + 1, c + 1);
}
else if (expr[i] == ')')
{
if (c > maxc)
{
ans = cur;
maxc = c;
}
return i + 1;
}
else
{
cur.push_back(expr[i]);
}
}
if (maxc == -1)
ans = cur;
return i + 1;
}
int main()
{
cin>>expr;
run(0, 0);
cout<<ans<<endl;
}
//(((3+4)+(5+6)))-(((5*8)-((6+4))))
//output: 6+4
//x-(y-(z-(q-a)))
//output: q-a
//1+2+3+4+5
//output: 1+2+3+4+5
//(((((1-2)-3)-4)-5)-6)
//output: 1-2
#include<stdio.h>//***************************C版本的!!!!!!
#include<string.h>
#define N 10010
char expr[N], ans[N];
int maxc = -1;
int run(int st, int c)
{
int i;
for (i = st;expr[i];i++)
{
if (expr[i] == '(')
{
i = run(i + 1, c + 1);
}
else if (expr[i] == ')')
{
if (c > maxc)
{
memcpy(ans, expr + st, i - st);
maxc = c;
}
return i + 1;
}
}
if (maxc == -1)
memcpy(ans, expr + st, i - st);
return i;
}
int main()
{
gets(expr);
run(0, 0);
printf("%s\n",ans);
}
//(((3+4)+(5+6)))-(((5*8)-((6+4))))
//output: 6+4
//x-(y-(z-(q-a)))
//output: q-a
//1+2+3+4+5
//output: 1+2+3+4+5
//(((((1-2)-3)-4)-5)-6)
//output: 1-2
热心网友
时间:2024-11-04 16:25
设置一个层数计数器数组,当遇到(时+1,遇到)-1,这样得到每个字符的层数了,x+都是0,y+z是1……
字符串里每一个字符都存到这个计数器数组里,然后找到最大的值,输出所有最大值位置上的字符
热心网友
时间:2024-11-04 16:25
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define MAX 1000
void main(void)
{
char target_express[1000];
int locate=-1,start=-1,startsum,i,k;
bool LeftMark=false;
i=k=startsum=0;
printf("输入表达式:\n");
scanf("%s",target_express);
while (target_express[i] != '\0')
{
if (target_express[i]=='(') //k表示当前'('层数,locate表示当前'('的位置
{
LeftMark=true;
k++;
locate=i;
}
else if(LeftMark&&target_express[i]==')') // 遇到‘)’终止当前计数,与存在的最大层数比较,若大于则更新数据
{ //startsum 表示当前存储的最大‘(’层数
//start 表示最大层数‘(’开始的位置
LeftMark=false;
if (k > startsum)
{
startsum = k; //最深
start = locate;
}
k=0;
}
i++;
}
start++; // 最终表达式不能含左括号,所以下标再往后移一位
while (target_express[start]!=')')
{
printf("%c",target_express[start]);
start++;
}
printf("\n");
}
热心网友
时间:2024-11-04 16:26
只匹配左括号就可以了。看哪个左括号的层数最多,另外,如果碰到第一个右括号的话,这次层数的计数要停止的。追问怎么实现,如何编程,急求答案……
追答{
char a[]="1+2+(3+4)+(5+6+(7+8))+9+0+(1+2)";
char b[255];
int i = 0;
int nCount1 = -1;
int nCount2 = -1;
int nTagStart = 0;
int nTagStop = 0;
int nTagStartTem = 0;
for(i = 0;i nCount2 )
{
nCount2 = nCount1;
nCount1 = -1;
nTagStart = nTagStartTem;
nTagStop = i - 1;
}
}
}
//b = (char*)malloc(nTagStop - nTagStart + 1)*sizeof(char);
memset(b,0,sizeof(char)*255);
memcpy(b,a+nTagStart+1,nTagStop-nTagStart);
cout<< b<< endl;
}
1+2+(3+4)+(5+6+(7+8))+9+0+(1+2)
7+8
Press any key to continue . . .
热心网友
时间:2024-11-04 16:27
well,这个是暴风影音的面试题吗?追问嗯,求帮忙啊
追答#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
void main(void)
{
char target_express[]="x+(y*z)+(m-(3+4))";
int start=-1,i,k;
bool LeftMark=false;
i=k=0;
while (target_express[i])
{
if (target_express[i]=='(')
{
LeftMark=true;
k++;
if(k>=2) // 找到了,是最深层圆括号
{
start=i;
break; // 若去掉这行,则可包含更深层的括号表达式
}
}
else if(LeftMark&&target_express[i]==')') // 非最深层圆括号
{
LeftMark=false;
k=0;
}
i++;
}
start++; // 最终表达式不能含左括号,所以下标再往后移一位
printf("表达式:%s\n最深层圆括号内的表达式为:",target_express);
while (target_express[start]!=')')
{
printf("%c",target_express[start]);
start++;
}
printf("\n");
}