666/001-洛谷P1957 口算练习题

        刷题网址在洛谷上,感兴趣的同学可以上去看看~

链接: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,和计算结果是否为负数,都会影响长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值