我已经骂不动这题了,不论是这一年级就会做的取模还有隐藏案例里面的无脑示例,不得不说,这道题算是比较恶心的题目了。(主要使用C语言)
题目如下:
两个一年级小朋友在一起玩游戏,小明给出一堆一位的正整数和运算要求(+、-、*、/、%),小丽要找出这些整数中的最大值和最小值,然后按照小明的要求算出最大数与最小数进行算术运算的结果。
输入:
用逗号分隔的一位正整数序列,及其运算符和等号
输出:
最大数 op 最小数=结果
并且题目给出的示例的输入只使用一次回车,所以只允许读入一次数据
例:5,1,1,2,0,3,+,=↵ 5+0=5↵
首先是我做这道题的大思路:关于数据的读入,scanf无法满足这道题的输入量,走投无路,我也想不到更好的、更简单的方法,我只能用C++的库函数,如果有大佬们有更好的方法,欢迎在评论区告诉我和其他人。
我选择的是 cin.get 函数,可以读取输入流中的数据,然后写入到指定的数组中。
char a[60]={0};
cin.get(a,60);
这句话的意思就是:读取六十个字符写入到创建的数组 a 中去。
对于这个字符串 a,遍历每一个字符,将数字读入数组中,将运算符单独存储,后面switch即可
关于遍历字符串:
有几个点必须要说明,特别是学C不久的同学们:
(1)isdigit函数:判断一个字符是否是十进制数,即是否是0~9,如果是的话就直接将他从ASCII码转成数字存到数组中去
(2)如果是两位数,则需要判断上后一位,然后相应的乘十调整,理论上还需要考虑三位数等更多位,由于题目的案例中没有,我直接偷懒。(正常的话需要一个while一直读入isdight为真的数值)
(3)current这一个标志的使用,算是给固定数组的元素个数做铺垫,由于是不定的数组输入,所以需要在数组中找值的范围也是变化的,于是就需要这个变量来固定查找范围。
while(a[i]!='\0'&&a[i]!='=')
{
if(a[i]==',') // 逗号跳过
{
i++;
continue;
}
else if(isdigit(a[i])&&(!isdigit(a[i+1])))
{
b[current]=a[i]-'0'; //调整数据类型至整型数字
current++;
i++;
}
else if(isdigit(a[i])&&(isdigit(a[i+1])))
{
b[current]=(a[i]-'0')*10+(a[i+1]-'0'); // 两位数的数字读取
current++;
i+=2;
}
else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'||a[i]=='%')
{
signal=a[i]; // 操作符的读取
i++;
}
}
查找数组最大值和最小值,我设置了两个函数,其中就用到了刚才的current:
正常的一次遍历,然后在固定范围内查找最大(小)值,这里的size均会调用刚才的current变量的值。然后b就是数组,传址调用。
int findmax(int*b,int size) // 找最大数
{
int i=0;
int max=b[0];
for(i=1;i<size;i++)
{
if(b[i]>max)
{
max=b[i];
}
}
return max;
}
int findmin(int*b,int size) // 找最小数
{
int i=0;
int min=b[0];
for(i=1;i<size;i++)
{
if(b[i]<min)
{
min=b[i];
}
}
return min;
}
最后就是数值运算:
在这里需要注意两个点:取模和除的第二个操作数都不能是0,显然案例没有考虑前者,但是在做题的时候,不能忘记讨论。
if(current<2) // 理论上输入数少于两个也需要报错
{
printf("Error!\n");
goto end;
}
if((signal=='/'||signal=='%')&&b1==0)
{
printf("Error!\n");
goto end;
}
顺带吐槽一下雷点:这第五个案例卡我半天,竟是输入了大于等于八个数字,难蚌
在这里附上完整的代码,仅供参考:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<math.h>
#include <iostream>
using namespace std;
int findmax(int*b,int size)
{
int i=0;
int max=b[0];
for(i=1;i<size;i++)
{
if(b[i]>max)
{
max=b[i];
}
}
return max;
}
int findmin(int*b,int size)
{
int i=0;
int min=b[0];
for(i=1;i<size;i++)
{
if(b[i]<min)
{
min=b[i];
}
}
return min;
}
int main()
{
char a[60]={0};
int current=0;
int b[20]={0};
int i=0;
cin.get(a,60);
char signal='?';
int a1=0;
int b1=0;
while(a[i]!='\0'&&a[i]!='=')
{
if(a[i]==',')
{
i++;
continue;
}
else if(isdigit(a[i])&&(!isdigit(a[i+1])))
{
b[current]=a[i]-'0';
current++;
i++;
}
else if(isdigit(a[i])&&(isdigit(a[i+1])))
{
b[current]=(a[i]-'0')*10+(a[i+1]-'0');
current++;
i+=2;
}
else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/'||a[i]=='%')
{
signal=a[i];
i++;
}
}
int sz=current;
a1=findmax(b,current);
b1=findmin(b,current);
if(current<2)
{
printf("Error!\n");
goto end;
}
if((signal=='/'||signal=='%')&&b1==0)
{
printf("Error!\n");
goto end;
}
switch (signal)
{
case '+':printf("%d+%d=%d\n",a1,b1,a1+b1);break;
case '-':printf("%d-%d=%d\n",a1,b1,a1-b1);break;
case '*':printf("%d*%d=%d\n",a1,b1,a1*b1);break;
case '/':printf("%d/%d=%d\n",a1,b1,a1/b1);break;
case '%':printf("%d%%%d=%d\n",a1,b1,a1%b1);break;
default:
printf("Error!\n");
}
end:
return 0;
}