数组---二年级小学生的题目

来源:互联网 发布:java求圆的周长和面积 编辑:程序博客网 时间:2024/04/20 02:21

【题】

二年级小学生的题目


    两个二年级小朋友在一起玩游戏,小明给出一堆不超过两位的正整数和运算要求(+、-、*、/、%),小丽要找出这些整数中的最大值和最小值,然后按照小明的要求算出最大数与最小数进行算术运算的结果。

输入:
    用逗号分隔的不超过两位的正整数序列,及其运算符和等号

输出: 
    最大数 op 最小数=结果

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助测试用例 1以文本方式显示
  1. 1,2,3,4,5,+,=↵
以文本方式显示
  1. 5+1=6↵
无限制61440KB0测试用例 6以文本方式显示
  1. 1,0,/,=↵
以文本方式显示
  1. Error!↵
无限制10240KB0
分析
这个题有两点:1、如何提取出数据和运算符;2、怎么求最大值和最小值

关于第二点,如何求最大值和最小值,这篇Blog里有:http://blog.csdn.net/debug__boy/article/details/8170983

至于如何取出数据,观察可以发现,数据和运算符之间是用逗号隔开的,所以肯定是利用逗号来处理。
可以这样考虑,首先一个一个读取字符,当碰到","时,则向前找,从前面提取数字。那么这些数是“不超过两位的正整数”,究竟是一位还是两位呢?
声明一个计数器(int counter = 0;)来记录数的位数,初始化为0。一个一个读取字符,当碰到'0'~'9'时,counter自增1;当碰到','时,利用counter来从前面提取数。如果counter==1,从前面一位提取;如果counter==2,则从前面2位提取。
注意,每次提取完数之后,counter要清零
运算符(+,-,*,/,%)和等号(=)的处理就不多说了。

例如,如果测试用例为1,23,45,6,7,+,=
初始时,counter = 0。
从i=0开始,str[i] = '1',则counter++; i++。
此时,str[i] = ',',则提取数字,因为counter为1,表示是一位,往前提取一位,得到数字1。counter置0。
i++;
此时,str[i] = '2',则counter++; 
i++;
此时,str[i] = '3',则counter++; 
i++;
此时,str[i] = ',',则提取数字,因为counter为2,表示是两位,往前提取两位,得到数字23。counter置0。
i++;
依次往后计算.......
直到str末尾为止。


代码

#include<stdio.h>#define N 100int main()   {       int i = 0;//循环变量,建议改为i,这样更专业int tmp;//记录找出的数char op;//运算符的位置    char str[N]; int max = 0;//这个初始值很重要,直接影响到后面max值的更新int min = 100;int count = 0;//记录这个数有几位,取1或2    gets(str);   i = 0;while(1)       {   if (str[i] >= '0' && str[i] <= '9')    //数字{count++;//位数自增1}else if (str[i] == ',')  //逗号{if (count == 1)  //一位{tmp = str[i-1] - '0';}else if (count == 2)          //两位{tmp = (str[i-2] - '0') * 10 + str[i-1] - '0';}if (max < tmp)  //更新max的值{max = tmp;}if (min > tmp) //更新min的值{min = tmp;}count = 0;//count清零}else if(str[i]=='*' || str[i]=='+'||str[i]=='-'||str[i]=='/'||str[i]=='%')           {               op = str[i];         break;             }else if (str[i] == '='){break; //遇到等号,跳出}i++;    }     switch(op)   {case '+':printf("%d+%d=%d\n", max, min, max + min);break;case '-':printf("%d-%d=%d\n", max, min, max - min);break;case '*':printf("%d*%d=%d\n", max, min, max * min);break;case '/':if(min == 0){printf("Error!\n");}else{printf("%d/%d=%d\n", max, min, max / min);}break;case '%':if(min == 0){printf("Error!\n");}else{printf("%d%%%d=%d\n", max, min, max % min);}break;}return 0;}

多说一点
这题中这些数是“不超过两位的正整数”,所以计数器counter的值最大为2,往前提取数的时候只有2种情况。
如果这些数是“多位的正整数”呢???
还是用计数器counter来记录数的位数,不同的是,要用一个循环来从前面提取数。
这样得到的数都是字符‘0’~‘9’,如何拼成一个正整数呢?再做一个循环处理。这篇Blog里有如何把一个正整数(十进制)的各个位提取出来:http://blog.csdn.net/debug__boy/article/details/8166453,这里就是它的逆向工程了,由各个位拼成一个完整的正整数。

如果这些数是“多位的整数”呢???怎么区别负号与减号呢???
最简单的方法是,如果counter==1,表示是减号;如果counter>1,表示是负号。
剩下的就好办了吧。。。



原创粉丝点击