软协学习第二周算法题

题目描述
王老师正在教简单算术运算。细心的王老师收集了i道学生经常做错的口算题,并且想整理编写成一份练习。 编排这些题目是一件繁琐的事情,为此他想用计算机程序来提高工作效率。王老师希望尽量减少输入的工作量,比如5+8的算式最好只要输入5和8,输出的结果要尽量详细以方便后期排版的使用,比如对于上述输入进行处理后输出 5+8=13 以及该算式的总长度6。王老师把这个光荣的任务交给你,请你帮他编程实现以上功能。

输入格式
第一行为数值i

接着的i行为需要输入的算式,每行可能有三个数据或两个数据。

若该行为三个数据则第一个数据表示运算类型,a表示加法运算,b表示减法运算,c表示乘法运算,接着的两个数据表示参加运算的运算数。

若该行为两个数据,则表示本题的运算类型与上一题的运算类型相同,而这两个数据为运算数。

输出格式
输出2*i行。对于每个输入的算式,输出完整的运算式及结果,第二行输出该运算式的总长度。
题解
首先要了解题目要求运算类型由本行输入的第一个数据决定,而第一个数据可能为字母’a’,‘b’,'c’也可能为一个数字;且输出结果为a+b=c的形式。
因此设双长整型数组b,c,d分别储存数据,设字符型数组k存放运算符号,字符型数组pan来存放判断运算类型的字符。

long long i,j,n,b[100],c[100],d[100],q=0,e=0;
	char pan[7]={0},t,k[100];

分别设加,减,乘三种运算的函数

long long add(int x,int y);
	long long jian(int x,int y);
	long long cheng(int x,int y);

输入需要运算的行数后,输入判断运算类型的字符
此处用到switch

switch(pan[0])
		{
			case'a':scanf("%lld %lld",&b[i],&c[i]);d[i]=add(b[i],c[i]);t=pan[0];k[i]='+';break;//将数据分别存放在数组bcd中以便输出。
			case'b':scanf("%lld %lld",&b[i],&c[i]);d[i]=jian(b[i],c[i]);t=pan[0];k[i]='-';break;
			case'c':scanf("%lld %lld",&b[i],&c[i]);d[i]=cheng(b[i],c[i]);t=pan[0];k[i]='*';break;

如果输入的第一个数据为数字,就应先将字符转化为整形数据

	default:
				for(j=0;j<strlen(pan);j++){
					e=(pan[j]-'0')+10*e;

由于t中存放了上次运算的判断字符所以再次进行判断决定这次运算的类型。

switch(t){
			case'a':scanf("%lld",&c[i]);d[i]=add(e,c[i]);b[i]=e;e=0;k[i]='+';break;//将e的值存放在b数组中。
			case'b':scanf("%lld",&c[i]);d[i]=jian(e,c[i]);b[i]=e;e=0;k[i]='-';break;
			case'c':scanf("%lld",&c[i]);d[i]=cheng(e,c[i]);b[i]=e;e=0;k[i]='*';
				break;
			}	

输出时直接输出事先存放的数组

for(i=0;i<n;i++)
	{
		printf("%lld%c%lld=%lld\n",b[i],k[i],c[i],d[i]);

设q为运算式中数据的总长度,初值为零。
如果结果为负则则将数字变为正数,q++。

if(d[i]<0)
		{
		d[i]*=-1;
		q++;
	}

接下来就要判断运算式的长度
由于所有的运算式都由运算符和数字组成,运算符固定为两个,因此只需要测出数据的的长度。
所有数据均为非负整数时,进行如下运算

if(b[i]!=0){
		while(b[i]!=0){
			b[i]/=10;\\如果是非零数据通过不断除以十直到零来计算每个数据的长度
			q++;
		}
	}
	else\\如果为零直接令位数++
	q++; 
	if(c[i]!=0){
	
		while(c[i]!=0){
			c[i]/=10;
			q++;
		}
	}
	else
	q++;
	if(d[i]!=0){
	
		while(d[i]!=0){
			d[i]/=10;
			q++;
		}
}
		else
		q++;

最后输出每个算式的位数,如果为最后一个算式则不加换行符

if(i!=n-1)
		printf("%lld\n",q+2);
		else
		printf("%lld",q+2);
		q=0;
以下为完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	long long i,j,n,b[100],c[100],d[100],q=0,e=0;
	char pan[7]={0},t,k[100];
	long long add(int x,int y);
	long long jian(int x,int y);
	long long cheng(int x,int y);
	scanf("%lld",&n);
	for(i=0;i<n;i++){
		fflush(stdin);
		scanf("%s",&pan);
		pan[strlen(pan)]='\0';
		switch(pan[0])
		{
			case'a':scanf("%lld %lld",&b[i],&c[i]);d[i]=add(b[i],c[i]);t=pan[0];k[i]='+';break;
			case'b':scanf("%lld %lld",&b[i],&c[i]);d[i]=jian(b[i],c[i]);t=pan[0];k[i]='-';break;
			case'c':scanf("%lld %lld",&b[i],&c[i]);d[i]=cheng(b[i],c[i]);t=pan[0];k[i]='*';break;
			default:
				for(j=0;j<strlen(pan);j++){
					e=(pan[j]-'0')+10*e;
				}
			switch(t){
			case'a':scanf("%lld",&c[i]);d[i]=add(e,c[i]);b[i]=e;e=0;k[i]='+';break;
			case'b':scanf("%lld",&c[i]);d[i]=jian(e,c[i]);b[i]=e;e=0;k[i]='-';break;
			case'c':scanf("%lld",&c[i]);d[i]=cheng(e,c[i]);b[i]=e;e=0;k[i]='*';
				break;
			}	
		}
	}
	for(i=0;i<n;i++)
	{
		printf("%lld%c%lld=%lld\n",b[i],k[i],c[i],d[i]);
		if(d[i]<0)
		{
		d[i]*=-1;
		q++;
	}
	if(b[i]!=0){
		while(b[i]!=0){
			b[i]/=10;
			q++;
		}
	}
	else
	q++; 
	if(c[i]!=0){
	
		while(c[i]!=0){
			c[i]/=10;
			q++;
		}
	}
	else
	q++;
	if(d[i]!=0){
	
		while(d[i]!=0){
			d[i]/=10;
			q++;
		}
}
		else
		q++;
		if(i!=n-1)
		printf("%lld\n",q+2);
		else
		printf("%lld",q+2);
		q=0;
	}
	return 0;
}
long long add(int x,int y)
{
	return x+y;
}
long long jian(int x,int y)
{
	return x-y;
}
long long cheng(int x,int y)
{
	return x*y;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值