洛谷 P1957 【口算练习题】

洛谷题目难度都是假的

读入:第一个用string读,判断是否是a,b,c,不是就用进制转换转成十进制数

位数:负数的负号也算一个!0也算一位!(特判或用dowhile)

下面是代码(没有写成子程序所以代码有重复之处,不要嫌长)

#include
#include
#include
using namespace std;
int t;
string last=" ";//存储上一个运算符号
int main(){
	cin>>t;
	while(t--){
		string x;int a,b;
		cin>>x;//用字符串先读第一个
		if(x=="a"||x=="b"||x=="c"){//是运算符号
			cin>>a>>b;//正常读入
		}
		else {
			for(int i=0;i<x.size();i++)
				a+=(x[i]-48)*pow(10,x.size()-i-1);
			//     变成数字     根据位数来算该数字是个十百···位
            		cin>>b;//读入第二个数字
			x=last;//取出上一个运算符号
		}
		last=x;//更新
		if(x=="a"){
			cout<<a<<'+'<<b<<'='<<a+b<<endl;
			int sum=0;
			int c=a+b//必须写在前面,不然都是0。下同
			do{//使得即使是0,sum也先加上1,下同
				sum++;
				a/=10;
			}while(a);
			sum+=1;//运算符号算一位
			do{
				sum++;
				b/=10;
			}while(b);
			sum+=1;//等于号
			do{
				sum++;
				c/=10;
			}while(c);
			cout<<sum<<endl;
		}
		else if(x=="b"){
			cout<<a<<'-'<<b<<'='<<a-b<<endl;
			int sum=0;
			int c=a-b;
			if(c<0)sum+=1;//处理负号
			do{
				sum++;
				a/=10;
			}while(a);
			sum+=1;
			do{
				sum++;
				b/=10;
			}while(b);
			sum+=1;
			do{
				sum++;
				c/=10;
			}while(c);
			cout<<sum<<endl;
		}
		else if(x=="c"){
			cout<<a<<'*'<<b<<'='<<a*b<<endl;
			int sum=0;
			int c=a*b;
			do{
				sum++;
				a/=10;
			}while(a);
			sum+=1;
			do{
				sum++;
				b/=10;
			}while(b);
			sum+=1;
			do{
				sum++;
				c/=10;
			}while(c);
			cout<<sum<<endl;
		}
	}	
	return 0;
}

你可能感兴趣的:(循环,字符串)