nyoj305
来源:互联网 发布:iphone刷机后 数据恢复 编辑:程序博客网 时间:2024/05/23 01:12
题目描述
Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。
假设表达式可以简单定义为:
1. 一个正的十进制数 x 是一个表达式。
2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。
3. 如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。
4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。
例如, 表达式 max(add(1,2),7) 的值为 7。
请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。
输入
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。)
输出
输出有N行,每一行对应一个表达式的值。
样例输入
3add(1,2) max(1,999) add(min(1,1000),add(100,99))
样例输出
3999200题意描述:有三种计算方式分别是add,min,max,根据计算规则算出括号内的值。解题思路:用字符串输入,然后把add,min,max分别用转换1000001,1000002,1000003存入数组中,数字原样存入,括号不做处理,然后从内到外计算,计算过后把结果存入add,min,max代表的数字里,而计算过的数字转换为-1,具体代码有体现。程序代码:
#include<stdio.h>
#include<string.h>
int main()
{
char str[10000];
int a[10000],b[100],c[100],d[100],o,l,i,j,n,m,t,t1,k,y,e,p[1000];
scanf("%d",&m);
getchar();
while(m--)
{
gets(str);
l=strlen(str);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
j=0;t=0;
for(i=0;i<l;i++)
{
if(str[i]=='m')
{
if(str[i+1]=='i')
{
a[j++]=1000001;
}
if(str[i+1]=='a')
{
a[j++]=1000002;
}
i=i+2;
}
if(str[i]=='a')
{
a[j++]=1000003;
i=i+2;
}
//if(str[i]=='(')
// {
// a[j++]=1004;
//}
if(str[i]>='0'&&str[i]<='9')
{
a[j]=a[j]*10+str[i]-'0';
}
if(str[i]==',')
{
j++;
}
}
/* for(i=0;i<=j;i++)
{
printf("%-8d ",a[i]);
}
printf("\n");*/
y=0;
for(o=0;o<=j;o++)
{
y++;
for(i=0;i<=j;i++)
{
if(a[i]>=1000001&&a[i+1]<1000000)
{
t1=0;
e=0;
for(k=i+1;k<=j;k++)
{
if(a[k]<1000000&&a[k]>=0)
{
b[t1]=a[k];
p[e]=k;
e++;
d[k]=a[k];
a[k]=-1;
t1++;
}
if(t1==2)
{
break;
}
if(a[k]>1000000)
{
t1=3;
break;
}
}
if(t1==3)//如 add(1,add(5,6))正常应该先计算第二个add但是我们写的代码是遇到add就向后面找两个小于1000000{ 的数进行计算,但是读取第一个add就开始找数了,找到的1 5 ,但是明显5不是在这里用的,因此在遇到第
二个add是应该跳出找数的循环,并进行该段代码把换成-1的恢复到原样。
for(t=0;t<e;t++)
{
a[p[t]]=d[p[t]];
}
continue;
}
else{
if(a[i]==1000001)
{
if(b[0]>b[1])
b[0]=b[1];
a[i]=b[0];
}
if(a[i]==1000002)
{
if(b[0]<b[1])
b[0]=b[1];
a[i]=b[0];
}
if(a[i]==1000003)
{
a[i]=b[1]+b[0];
}
}
}
//printf("b==%d %d\n",b[0],b[1]);
}
/* for(i=0;i<=j;i++)
{
printf("%-8d ",a[i]);
}
printf("\n");*/
}
//printf("y==%d\n",y);
printf("%d\n",a[0]);
}
return 0;
}
- nyoj305
- nyoj305
- nyoj305
- nyoj305
- 表达式求值(nyoj305)
- NYOJ305 表达式求值
- 表达式求值(nyoj305)
- NYOJ305表达式求值
- nyoj305 表达式求值(递归)
- NYOJ305 表达式求值(递归or栈)
- nyoj305表达式求值 栈的应用
- nyoj305表达式求值(数据结构---栈)
- nyoj305-表达式求值(栈。。dfs)
- 回顾 ——表达式求值——NYOJ305
- nyoj305表达式求值(第四届河南省程序设计大赛)
- NYOJ305 表达式求值(河南省第四届ACM省赛)
- Linux目录结构及文件基本操作
- Android--我的命名规范
- Spring学习:注入方法和bean的Scope(xml)
- 根据中序和前序遍历构建二叉树
- 骄傲的代价
- nyoj305
- iOS 开发问与答(103-122)
- ArrayList源码解析
- 关于Stage3D中Matrix3D
- Jquery中AJAX参数详细介绍
- MVP架构在Android平台上的实现分析
- SpringBoot介绍
- Centos 7 搭建 Zabbix
- 【机器学习】贝叶斯角度看L1,L2正则化