8. 计算器PLUS

高老师的学术科研开展的如火如荼,但最近有件事让他很烦恼,在做学术研究过程中,经常需要对很大很大的数据进行计算,而现有的计算器没办法满足这种计算需求,所以现在想请大家帮忙实现一个计算器PLUS版。

为了减少大家的工作量,高老师已经将函数的输入输出接口定义完成,你只需编写计算器PLUS的核心部分。

例如 plus() , minus() 和 multiply() 函数,有三个char * 类型的参数 a、b 和 c,a 和 b 分别是参与运算的两个整数,c 用来存放运算结果。所有数字以字符串的形式保存。

* 注意,你只需提交编写的三个函数即可。

输入

输入的每一行是两个十进制的非负整数(每个整数由最多 500 个数字组成)和一个运算符(加号或减号或乘号)。

输出

对应着输入的每一行数据,输出计算的结果,每个结果占一行,且结果长度不超过1000位。

预设代码

前置代码

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */

#include <stdio.h>
#include <string.h>

void plus(char *a, char *b, char *c);
void minus(char *a, char *b, char *c);
void multiply(char *a, char *b, char *c);

int main()
{       
    char a[1000];
    char b[1000];
    char c[1000];
    char s[2];

    while (scanf("%s %s %s\n", a, s, b) == 3) {
        if (s[0] == '+') {
            plus(a, b, c);
        } else if (s[0] == '-') {
            minus(a, b, c);
        } else if (s[0] == '*') {
            multiply(a, b, c);
        }
        printf("%s\n", c);
    }

    return 0;
}

/* PRESET CODE END - NEVER TOUCH CODE ABOVE */


测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. 1 + 2↵
  2. 3 - 2↵
  3. 1 * 2↵
以文本方式显示
  1. 3↵
  2. 1↵
  3. 2↵
1秒1024KB0


#include<cstdio>
#include<cstring>

void plus(char *a, char *b, char *c)      
{
	for (int i = 0; i < 1000; i++)
		c[i] = '\0';
	int cc[1000] = { 0 };
	int alen = strlen(a);
	int blen = strlen(b);
	int ai = alen - 1, bi = blen - 1, numa = 0, numb = 0;
	for (int i=999; i >=0; i--)
	{
		if (ai >= 0)
			numa = a[ai] - '0';
		if (bi >= 0)
			numb = b[bi] - '0';
		if (ai < 0)
			numa = 0;
		if (bi < 0)
			numb = 0;
		if(i>=0)
			cc[i] = numa + numb;
		ai--;bi--;
	}
	for (int i =999; i >= 0; i--)
	{
		if (cc[i] >= 10)
		{
			cc[i] %= 10;
			cc[i - 1] += 1;
		}
	}
	int st = 0;
	for (int i = 0;i<1000; i++)
	{
		if (cc[i] != 0)
		{
			st = i;
			break;
		}
		st = i;
	}
	int jj = 0;
	for (int i = st; i <= 999; i++, jj++)
		c[jj] = cc[i] + '0';
	for (int i = 0; i < 1000; i++)
	{
		a[i] = '\0';
		b[i] = '\0';
	}
}
void minus(char *a, char *b, char *c)	
{
	for (int i = 0; i < 1000; i++)
		c[i] = '\0';
	int cc[1000] = { 0 };
	int alen = 0;//没消去前导零的长度
	for (int i = 0; i<1000; i++)
	{
		if (a[i] != '\0')
			alen++;
		else
			break;
	}
	int blen = 0;
	for (int i = 0; i<1000; i++)
	{
		if (b[i] != '\0')
			blen++;
		else
			break;
	}
	int sta = 0, stb = 0;
	for (int i = 0; i < alen; i++)
	{
		if (a[i] != '0')
		{
			sta = i;
			break;
		}
		sta = i;
	}
	int aalen = alen - sta;//净长度=包含前导零的长度-前导零的长度
	for (int i = 0; i < blen; i++)
	{
		if (b[i] != '0')
		{
			stb = i;
			break;
		}
		stb = i;
	}
	int bblen = blen - stb;
	int Flag = 1;	//如果a>=b,则Flag=1,反之Flag=0;
	if (aalen > bblen)
		Flag = 1;
	else if (aalen < bblen)
		Flag = 0;
	else
	{
		int i = sta, j = stb;
		for (int k = 1; k <= aalen; k++,i++,j++)
		{
			if (a[i] < b[j])
			{
				Flag = 0;
				break;
			}
			if (a[i] > b[j])//忘记这个条件,结果乐学上一直RE,例如2000-1999就运行出错
				break;
		}
	}
	int ai = alen - 1, bi = blen - 1, numa = 0, numb = 0;
	if(Flag)
		for (int i = 999; i >= 0; i--)
		{
			if (ai >= 0)
				numa = a[ai] - '0';
			if (bi >= 0)
				numb = b[bi] - '0';
			if (ai < 0)
				numa = 0;
			if (bi < 0)
				numb = 0;
			if (i >= 0)
				cc[i] = numa - numb;
			ai--; bi--;
		}
	else
		for (int i = 999; i >= 0; i--)
		{
			if (ai >= 0)
				numa = a[ai] - '0';
			if (bi >= 0)
				numb = b[bi] - '0';
			if (ai < 0)
				numa = 0;
			if (bi < 0)
				numb = 0;
			if (i >= 0)
				cc[i] = numb - numa;
			ai--; bi--;
		}
	for (int i = 999; i >=0; i--)
	{
		if (cc[i] < 0)
		{
			cc[i - 1]--;
			cc[i] += 10;
		}	
	}
	int st = 0;
	for (int i = 0; i<1000; i++)
	{
		if (cc[i] != 0)
		{
			st = i;
			break;
		}
		st = i;
	}
	if (!Flag)		//如果a<b,则为负
		printf("-");
	int jj = 0;
	for (int i = st; i <= 999; i++, jj++)
		c[jj] = cc[i] + '0';
	for (int i = 0; i < 1000; i++)
	{
		a[i] = '\0';
		b[i] = '\0';
	}
}
void multiply(char *a, char *b, char *c)
{
	for (int i = 0; i < 1000; i++)
		c[i] = '\0';
	int cc[1000] = { 0 };
	int alen = 0;//没消去前导零的长度
	for (int i = 0; i<1000; i++)
	{
		if (a[i] != '\0')
			alen++;
		else
			break;
	}
	int blen = 0;
	for (int i = 0; i<1000; i++)
	{
		if (b[i] != '\0')
			blen++;
		else
			break;
	}
	int sta = 0, stb = 0;
	for (int i = 0; i < alen; i++)
	{
		if (a[i] != '0')
		{
			sta = i;
			break;
		}
		sta = i;
	}
	for (int i = 0; i < blen; i++)
	{
		if (b[i] != '0')
		{
			stb = i;
			break;
		}
		stb = i;
	}
	int count = 0;
	for (int i = blen-1; i >= stb; i--)
	{
		for (int j = alen - 1,k=0; j >= sta; j--,k++)
		{
			if ((999 - count - k) >= 0 && i >= 0 && j >= 0)
				cc[999 - count - k] += (b[i] - '0')*(a[j] - '0');
		}
		count++;
	}
	for (int i = 999; i >= 0; i--)
	{
		if (cc[i] >= 10)
		{
			int mo = cc[i] % 10;
			cc[i - 1] += (cc[i] - mo) / 10;
			cc[i] = mo;
		}
	}
	int st = 0;
	for (int i = 0; i<1000; i++)
	{
		if (cc[i] != 0)
		{
			st = i;
			break;
		}
		st = i;
	}
	int jj = 0;
	for (int i = st; i <=999; i++, jj++)
		c[jj] = cc[i] + '0';
	for (int i = 0; i < 1000; i++)
	{
		a[i] = '\0';
		b[i] = '\0';
	}
}

int main()
{
	char a[1000];
	char b[1000];
	char c[1000];
	char s[2];

	while (scanf("%s %s %s", a, s, b) == 3)
	{
		if (s[0] == '+') 
		{
			plus(a, b, c);
		}
		else if (s[0] == '-') 
		{
			minus(a, b, c);
		}
		else if (s[0] == '*') 
		{
			multiply(a, b, c);
		}
		printf("%s\n", c);
	}

	return 0;
}




  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值