NYOJ128(测试数据提示)

NYOJ 128


  测了很长时间,一直runtime error。。才发现是数据输入的问题没有考虑完全

比如 + 2 3 (若3后面有空格)

        若数据之间有空格 ,你是否处理了?


因此,因为空格的原因。。一直runtime error

同时数组尽量开大一些。


这里给一个 手动处理 浮点数剧原生态代码。

#include<cstdio>
#include<iostream>
#include<stack>
#include<cstring>
using namespace std;

double stnum[501];

int top = 0;
void Calculation(char str)
{
	double a,b;
	a = stnum[--top] ;
	
	b = stnum[--top];

	
	switch(str )
	{
		case '+': stnum[top++] = (a+b);break; 
		case '-': stnum[top++] =(a-b);break;
		case '*': stnum[top++] =(a*b);break;
		case '/': stnum[top++] =(a/b);break;
				
	}
	
}

int main()
{
	int n,len,i;
	char str[10000],c;
	double sum1,sum2,j;
	
	while(gets(str)!=NULL)
	{
		 top = 0;	
		len = strlen(str);
		for(i=len -1 ; i>=0 ;)
		{
			if(str[i] >= '0' && str[i] <= '9')
		    {
		    	sum1 =0;j= 1;
		    	while(i>=0 && str[i] >= '0' && str[i] <= '9')
			    {
			    	sum1 += (str[i] - '0')*j;
			    	j*=10;
			    	i--;
				}
				if(i>=0 && str[i] == '.')
				{
					sum1 = (sum1)/j;
					sum2 = 0;i--;j = 1;
				    while(i>=0 && str[i] >= '0' && str[i] <= '9')
			        {
			    	  sum2 += (str[i] - '0')*j;
			    	  j*=10;
			    	  i--;
				    }	
					sum1 += sum2  ;
				}	
			//	printf("sum1-->%lf \n",sum1);
				stnum[top++] = sum1;
				
	     	}
	     	else if(str[i] == ' ') //多空格处理的
	     	{
	     		i--;
		}
	     	else
	     	{
	     		Calculation(str[i]);
	     		i--;
			}
	
		}
		printf("%.2lf\n",stnum[0]);
		top--;

	}
	return 0;
}

再给一个 sscanf 很好用  对字符串数据的处理


#include<stdio.h>

#include<string.h>

double stnum[1000];
//stack <char> ststr;
int top = 0;
void Calculation(char str)
{
	double a,b;
	a = stnum[--top] ;
	
	b = stnum[--top];

	
	switch(str )
	{
		case '+': stnum[top++] = (a+b);break; 
		case '-': stnum[top++] =(a-b);break;
		case '*': stnum[top++] =(a*b);break;
		case '/': stnum[top++] =(a/b);break;
				
	}
	
}

int main()
{
	int n,len,i;
	char str[1010],c;
	double sum1,j;
	
	while(gets(str)!= NULL)
	{
		 top = 0;	
		len = strlen(str);
		for(i=len -1 ; i>=0 ;)
		{
			if(str[i] >= '0' && str[i] <= '9')
		    {
		    	while(i>=0 && str[i] >= '0' && str[i] <= '9')
		    	{
		    		i--;
				}
				if(str[i] == '.')
				{
					i--;
				   while(i>=0 && str[i] >= '0' && str[i] <= '9')
		    	   {
		    		 i--;
				   }
				}
				i++;
				//printf("i-->%d\n",i);
				sscanf(&str[i],"%lf",&sum1);
				stnum[top++] = sum1;
				i--;
	     	}
	     	else if(str[i] == ' ')
	     	{
	     		i--;
			 }
	     	else
	     	{
	     		Calculation(str[i]);
	     		i--;
			}
	
		}
		printf("%.2lf\n",stnum[0]);
	
		
	
	}
	return 0;
}


求一题测试数据测试数据

10-07

Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。rnrn 假设表达式可以简单定义为:rnrn 1. 一个正的十进制数 x 是一个表达式。rnrn 2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。rnrn 3. 如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。rnrn 4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。rnrn 例如, 表达式 max(add(1,2),7) 的值为 7。rnrn 请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。rnrn输入rn 第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)rn 接下来有N行, 每行是一个字符串,表示待求值的表达式rn (表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不rn 超过1000。)rn输出rn 输出有N行,每一行对应一个表达式的值。rn样例输入rnrn 3rn add(1,2) rn max(1,999) rn add(min(1,1000),add(100,99)) rnrn样例输出rnrn 3rn 999rn 200rnrnrnimport java.util.*;rnpublic class Main305 rnpublic static void main(String[] args) rn Scanner in = new Scanner(System.in);rn int n = in.nextInt();rn for(int i=0;i='9')rn flag = false;rn break;rn rn rn if(flag)System.out.println(str);rn elsern char[] ch = new char[1001];//定义缓存区rn int p = -1 ;//定义缓存区指针rn Stack s = new Stack();//存储a-z字母的栈rn Stack s2 = new Stack();//存储左括号rn Stack stack = new Stack();rn for(int i1=0;i1='a'&&c<='z')rn s.push(c);rn rn else if((c>='0'&&c<='9')||c==',')rn //如果是逗号,则将缓存区的char转换成Integer然后讲其压入stackrn if(c==',')rn if(str.charAt(i1-1)!=')')rn stack.push(Integer.valueOf(new String(ch,0,p+1)));rn p=-1;//把指针指回-1rn rn rn elsern ch[++p]=c;rn rn rn rn else if(c==')')rn s2.pop();rn if(!s2.isEmpty())rn if(str.charAt(i1-1)==')')rn char ch2[] = new char[3];//操作符rn ch2[2]=s.pop();rn ch2[1]=s.pop();rn ch2[0]=s.pop();rn String czf = new String(ch2);rn if(czf.equals("add"))rn stack.push(stack.pop()+stack.pop());rn rn else if(czf.equals("min"))rn stack.push((int)Math.min(stack.pop(), stack.pop()));rn rn else rn stack.push((int)Math.max(stack.pop(), stack.pop()));rn rn rn elsern stack.push(Integer.valueOf(new String(ch,0,p+1)));rn p=-1;//把指针指回-1rn char ch2[] = new char[3];//操作符rn ch2[2]=s.pop();rn ch2[1]=s.pop();rn ch2[0]=s.pop();rn String czf = new String(ch2);rn if(czf.equals("add"))rn stack.push(stack.pop()+stack.pop());rn rn else if(czf.equals("min"))rn stack.push((int)Math.min(stack.pop(), stack.pop()));rn rn else rn stack.push((int)Math.max(stack.pop(), stack.pop()));rn rn rn rn rn elsern if(stack.size()==1)rn stack.push(Integer.valueOf(new String(ch,0,p+1)));rn p=-1;rn rn char ch2[] = new char[3];//操作符rn ch2[2]=s.pop();rn ch2[1]=s.pop();rn ch2[0]=s.pop();rn String czf = new String(ch2);rn if(czf.equals("add"))rn System.out.println(stack.pop()+stack.pop());rn rn else if(czf.equals("min"))rn System.out.println((int)Math.min(stack.pop(), stack.pop()));rn rn else rn System.out.println((int)Math.max(stack.pop(), stack.pop()));rn rn rn rn rn rn else if(c=='(')s2.push(c);rn rn rn rn rn rn rn rnrnrnrn代码不用看,求帮忙想一些复杂的测试数据,假如出错了就回帖告诉我一下,感激不尽,我试了很多都对,但是提交就WrongAnswer了,抓狂啊 论坛

没有更多推荐了,返回首页