数组---二年级小学生的题目
来源:互联网 发布:java求圆的周长和面积 编辑:程序博客网 时间:2024/04/20 02:21
【题】
二年级小学生的题目
两个二年级小朋友在一起玩游戏,小明给出一堆不超过两位的正整数和运算要求(+、-、*、/、%),小丽要找出这些整数中的最大值和最小值,然后按照小明的要求算出最大数与最小数进行算术运算的结果。
输入:
用逗号分隔的不超过两位的正整数序列,及其运算符和等号
输出:
最大数 op 最小数=结果
- 1,2,3,4,5,+,=↵
- 5+1=6↵
- 1,0,/,=↵
- Error!↵
【分析】
这个题有两点: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,表示是负号。
剩下的就好办了吧。。。
- 数组---二年级小学生的题目
- 二年级小学生的题目
- 五年级小学生的题目
- 一张小学二年级的请假条
- 感情日记: 一个二年级的数学题
- 大学二年级
- 回忆录-----小学 二年级
- 二年级开学倒计时
- 研究生二年级的上学期思想上的一些改变
- 题目74 小学生算术
- 小学生算术--题目74
- 题目74-小学生算术
- 看看我们小学二年级是不是混过来的
- 一个二年级菜鸟对于面向对象的一些感悟
- 算法题目二:找到数组中迷失的数字
- nyoj题目74:小学生算术
- 南阳题目74-小学生算术
- ACM题目_小学生统计数字
- 【android build】 如何在android.mk中获得打印信息
- Struts深入理解
- 在Linux Mint13下编译并安装nodejs
- 设计模式(11) ------------解释器模式
- 生成N个随机数,和为1
- 数组---二年级小学生的题目
- js实现三级联动-年月日
- 关于log_error_write
- PaginationSupport: 分页查询技术文档
- datagridview刷新,更新,refresh
- 马云终获阿里巴巴控制权
- 用一个例子说明什么是多态
- dsa
- 每天一个linux命令(5):rm 命令