高老师的学术科研开展的如火如荼,但最近有件事让他很烦恼,在做学术研究过程中,经常需要对很大很大的数据进行计算,而现有的计算器没办法满足这种计算需求,所以现在想请大家帮忙实现一个计算器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 */
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 1024KB | 0 |
#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;
}