刷题网址在洛谷上,感兴趣的同学可以上去看看~
链接:https://www.luogu.com.cn/problem/P1957
#include<iostream>
#include<cstring> //strlen统计字符数头文件
#include<cmath> //算术运算函数头文件
#include<cstdio> //标准化输入输出头文件
using namespace std;
int main(){
char ys0,ys1[10]; //ys0保存计算字符 ys1[10]用于输入字符还是数值判断
int n,y0,x=0,y,ans,x0,js; //n个数 y0,x0,ans用于保存计算数值 js判断总计算长度
cin>>n;
for(int i=0;i<n;i++){
cin>>ys1;
if(ys1[0]>='a' && ys1[0]<='z'){ //判断第一个输入是否为字符
ys0=ys1[0]; //保留第一个字符ys0
cin>>x>>y; //ys1字符,故输入x,y
y0=y; //保留整数值y0,x0
x0=x;
}
else{
cin>>y; //ys1数值,做x用,故输入y
for(int j=0;j<strlen(ys1);j++){
//pow(10,strlen(ys1)-j-1),例如:[123]第一个1为百位100,而2为十位10,故次方数变化跟随j-1走
//ys1[j]-48,把对于的字符变为对于数值如字符'1'转为数值1
x=x+pow(10,strlen(ys1)-j-1)*(ys1[j]-48); //用于把字符型转整数值 例如:字符[123]转整数值123
y0=y; //保留整数值y0,x0
x0=x;
}
}
if(ys0=='a'){ //判断计算方式
printf("%d+%d=%d\n",x0,y0,x0+y0);
ans=x0+y0; //保留计算结果
}
else if(ys0=='b'){
printf("%d-%d=%d\n",x0,y0,x0-y0);
ans=x0-y0;
}
else if(ys0=='c'){
printf("%d*%d=%d\n",x0,y0,x0*y0);
ans=x0*y0;
}
//字符数值统计,如果输入是0或计算结果负数怎么统计
if(ans>0){ //结果若为负数,提前统计
js=2; //提前统计计算符号和等于号 x + y = z 中的+ =号
}
else{
js=3;
ans=-1*ans;
}
if(x0==0) //输入若为0,提前统计
js++;
if(y0==0)
js++;
while(x0!=0 || y0!=0 || ans!=0){ //确定所有数值个数
if(x0!=0){ //判断x0位数如123,三位,下面同
x0/=10;
js++;
}
if(y0!=0){
y0/=10;
js++;
}
if(ans!=0){
ans/=10;
js++;
}
}
cout<<js<<endl; //输出总计算长度
js=0; //为下次继续计数长度做准备赋值0
x=0; //为下次输入值做准备赋值0
}
system("pause");
}
题目思路:
1.输入数值n组
2.第一种:有确定计算符号,先输入字符
3.第二种:承接上一次计算方式,没有再次输入字符,此时需要重点判断
且:由于输入是字符数值,如何转换为整数数值,也是一个重点思路
4.根据判断,直接计算即可
5.总计算长度,需要看输入是否为0,和计算结果是否为负数,都会影响长度