1000题比较简单,不再写,从1001开始记录我的编程练习之路
题目:
love8909最近在学一种新的表达式表示法,称之为<DotNotation>。定义如下:
<DotNotation> := <Number> | <DotNotation><Dots><Operator><Dots><Number>
<Dots> := "" | <Dots>"."
<Operator> := exactly one of "+-*/"
<Number> := exactly one of "0123456789"
这是一个递归的定义,即是说
单个的数字是<DotNotation>
在<DotNotation>后连接任意数量的”.”(<Dots>),然后连接一个操作符(<Operator>),再接上任意数量的”.”,最后再接一个数字,得到的还是还是一个<DotNotation>
比如说,"5"是一个<DotNotation>,如果在后面接上".+.7",你将得到另一个<DotNotation>, 如果你再在后面接上"*..3"得到"5.+.7*..3",这还是一个<DotNotation>。
可是love8909很纠结,因为他竟然不会判断一个<DotNotation>是否合法,你能帮帮他吗?
Input
第1行一个数T,表示测试数据组数
后面T行每行一个长度为L的字符串(1 <= L <= 50)
Output
T行,每一行,如果合法,输出”Yes”,反之输出”No”
Sample Input
5
3+5
9..+.5...*....3
5.3+4
9*9*9*9*9*9*9*9*9*9*9*9*9*9
3.........../...........4
Sample Output
Yes
Yes
No
Yes
Yes
我的代码如下:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int i=0;
void judge(char *s,int *p);
int main()
{
int t;
int *p;
char str[51]={'\0'};
scanf("%d",&t);
p=(int*)malloc(sizeof(int)*t);
for(i=0;i<t;i++)
{
scanf("%s",str);
judge(str,p);
}
for(i=0;i<t;i++)
{
if(p[i]==1)
printf("Yes\n");
else
printf("No\n");
}
free(p);
return 0;
}
void judge(char *s,int *p)
{
int dotnum=0;
int calnum=0;
int n;
int slen=strlen(s);
char s1[51]={'\0'};
if (slen==1)
{
if(s[0]>='0'&&s[0]<='9')
p[i]=1;
else
p[i]=0;
}
else
{
if(s[slen-1]>='0'&&s[slen-1]<='9')
{
n=slen-2;
while(s[n]=='.'||s[n]=='+'||s[n]=='-'||s[n]=='*'||s[n]=='/')
{
if(s[n]=='.')
dotnum++;
else
calnum++;
n--;
}
if(calnum==1)
{
strncpy(s1,s,slen-1-dotnum-calnum);
judge(s1,p);
}
else
p[i]=0;
}
else
p[i]=0;
}
}
这里面用的是递归的方法。流程图就不画了,随后会把代码的注释加上(晕,怎么这上面不支持缩进呀,明明代码上面有缩进,一发表就没了)