8.计算器PLUS

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

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

例如 plus() , minus() 和 multiply() 函数,有三个char * 类型的参数 a、b 和 c,a 和 b 分别是参与运算的两个整数,c 用来存放运算结果。所有数字以字符串的形式保存。你的计算结果(在 c 中保存)中不应包含任何前导零。

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

预设代码

/* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
 
#include <stdio.h>  
#include <string.h>  
  
void plus(const char * a, const char * b, char * c);  
void minus(const char * a, const char * b, char * c);  
void multiply(const char * a, const char * b, char * c);  
  
int main()  
{  
    static char a[100005];  
    static char b[100005];  
    static char c[200005];  
    static 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;  
}  
  
/* PRESET CODE END - NEVER TOUCH CODE ABOVE */  

思路就是模拟笔算的过程,对于乘法可以先实现一个多位与个位数相乘的,然后转换为多个加法相加。

#define MAX 100000
void plus(const char *a, const char *b, char *c)
{
	for (int i = 0; i < MAX; i++)
		c[i] = '\0';
	int d[MAX] = { 0 };
	int ai = strlen(a) - 1, bi = strlen(b) - 1, numa = 0, numb = 0;
	for (int i = MAX - 1; 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)
			d[i] = numa + numb;
		ai--;
		bi--;
	}
	for (int i = MAX - 1; i >= 0; i--)
	{
		if (d[i] >= 10)
		{
			d[i] %= 10;
			d[i - 1] += 1;
		}
	}
	int temp = 0;
	for (int i = 0; i<MAX; i++)
	{
		if (d[i] != 0)
		{
			temp = i;
			break;
		}
		temp = i;
	}
	int k = 0;
	for (int i = temp; i <= MAX - 1; i++, k++)
		c[k] = d[i] + '0';
}
void minus(const char *a, const char *b, char *c)
{
	for (int i = 0; i < MAX; i++)
		c[i] = '\0';
	int d[MAX] = { 0 };
	int alen = 0;
	for (int i = 0; i<MAX; i++)
	{
		if (a[i] != '\0')
			alen++;
		else
			break;
	}
	int blen = 0;
	for (int i = 0; i<MAX; i++)
	{
		if (b[i] != '\0')
			blen++;
		else
			break;
	}
	int zeroa = 0, zerob = 0;
	for (int i = 0; i < alen; i++)
	{
		if (a[i] != '0')
		{
			zeroa = i;
			break;
		}
		zeroa = i;
	}
	int aalen = alen - zeroa;
	for (int i = 0; i < blen; i++)
	{
		if (b[i] != '0')
		{
			zerob = i;
			break;
		}
		zerob = i;
	}
	int bblen = blen - zerob;
	int nega = 1;
	if (aalen > bblen)
		nega = 1;
	else if (aalen < bblen)
		nega = 0;
	else
	{
		int i = zeroa, j = zerob;
		for (int k = 1; k <= aalen; k++, i++, j++)
		{
			if (a[i] < b[j])
			{
				nega = 0;
				break;
			}
			if (a[i] > b[j])
				break;
		}
	}
	int ai = alen - 1, bi = blen - 1, numa = 0, numb = 0;
	if (nega)
		for (int i = MAX - 1; 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)
				d[i] = numa - numb;
			ai--; bi--;
		}
	else
		for (int i = MAX - 1; 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)
				d[i] = numb - numa;
			ai--; bi--;
		}
	for (int i = MAX - 1; i >= 0; i--)
	{
		if (d[i] < 0)
		{
			d[i - 1]--;
			d[i] += 10;
		}
	}
	int temp = 0;
	for (int i = 0; i<MAX; i++)
	{
		if (d[i] != 0)
		{
			temp = i;
			break;
		}
		temp = i;
	}
	if (!nega)
		printf("-");
	int k = 0;
	for (int i = temp; i <= MAX - 1; i++, k++)
		c[k] = d[i] + '0';
}
void multiply(const char *a, const char *b, char *c)
{
	for (int i = 0; i < MAX; i++)
		c[i] = '\0';
	int d[MAX] = { 0 };
	int alen = 0;
	for (int i = 0; i<MAX; i++)
	{
		if (a[i] != '\0')
			alen++;
		else
			break;
	}
	int blen = 0;
	for (int i = 0; i<MAX; i++)
	{
		if (b[i] != '\0')
			blen++;
		else
			break;
	}
	int zeroa = 0, zerob = 0;
	for (int i = 0; i < alen; i++)
	{
		if (a[i] != '0')
		{
			zeroa = i;
			break;
		}
		zeroa = i;
	}
	for (int i = 0; i < blen; i++)
	{
		if (b[i] != '0')
		{
			zerob = i;
			break;
		}
		zerob = i;
	}
	int count = 0;
	for (int i = blen - 1; i >= zerob; i--)
	{
		for (int j = alen - 1, k = 0; j >= zeroa; j--, k++)
		{
			if ((MAX - 1 - count - k) >= 0 && i >= 0 && j >= 0)
				d[MAX - 1 - count - k] += (b[i] - '0')*(a[j] - '0');
		}
		count++;
	}
	for (int i = MAX - 1; i >= 0; i--)
	{
		if (d[i] >= 10)
		{
			int carry = d[i] % 10;
			d[i - 1] += (d[i] - carry) / 10;
			d[i] = carry;
		}
	}
	int temp = 0;
	for (int i = 0; i<MAX; i++)
	{
		if (d[i] != 0)
		{
			temp = i;
			break;
		}
		temp = i;
	}
	int k = 0;
	for (int i = temp; i <= MAX - 1; i++, k++)
		c[k] = d[i] + '0';
}

猜你喜欢

转载自blog.csdn.net/ArgentumHook/article/details/83050918