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