代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define MAXNUM (int)300
//去除字符串前面的0
void movePreZero(char c[])
{
int i;
while (c[0] == '0')
{
for (i = 0; i < strlen(c) - 1; i++)
c[i] = c[i + 1];
c[strlen(c) - 1] = 0;
}
}
//显示字符串
void print(char c[])
{
int i = 0;
int flag = 0;
for (i = 0; c[i] != '\0'; i++)
{
if (c[i] != '0')
flag = 1;
if (flag)
printf("%c", c[i]);
else
printf(" ");
}
printf("\n");
}
//大数相加 c = a + b
void bigAdd(char a[], char b[], char c[])
{
int i = 0;
int shift = 0, val;
int l1 = strlen(a);
int l2 = strlen(b);
int len = l1 > l2 ? l1 : l2;
len += 1; //多留一个进位
c[len] = 0; //后一个位置为0
//从后往前迭代
l1--;
l2--;
len--;
while (l1 >= 0 && l2 >= 0)
{
int t = (a[l1] - '0') + (b[l2] - '0') + shift;
if (t >= 10)
{
shift = 1;
t -= 10;
c[len] = '0' + t;
}
else
{
shift = 0;
c[len] = '0' + t;
}
len--;
l1--;
l2--;
}
//a
while (l1 >= 0)
{
int t = (a[l1] - '0') + shift;
if (t >= 10)
{
shift = 1;
t -= 10;
c[len] = '0' + t;
}
else
{
shift = 0;
c[len] = '0' + t;
}
len--;
l1--;
}
//b
while (l2 >= 0)
{
int t = (b[l2] - '0') + shift;
if (t >= 10)
{
shift = 1;
t -= 10;
c[len] = '0' + t;
}
else
{
shift = 0;
c[len] = '0' + t;
}
len--;
l2--;
}
if (shift != 0)
c[0] = '0' + shift;
else
c[0] = '0';
movePreZero(c);
}
//大数相乘 c = a * b
void bigMul(char a[], char b[], char c[])
{
int i, j, t, k, val;
int maxlen;
int shift = 0;
int l1 = strlen(a);
int l2 = strlen(b);
char tmp[MAXNUM] = { 0 };
//结果最多是l1+l2位数
maxlen = l1 + l2;
c[maxlen] = 0; //字符串正常结束
for (i = 0; i < maxlen; i++)
c[i] = '0';
if (l1 < l2)
{
//交换a和b
strcpy(tmp, a);
strcpy(a, b);
strcpy(b, tmp);
t = l1;
l1 = l2;
l2 = t;
}
for (t = 0, i = l2 - 1; i >= 0; i--, t++) //遍历b,乘以a的所有数
{
shift = 0;
memset(tmp, '0', maxlen);
tmp[maxlen] = 0;
for (k = 0, j = l1 - 1; j >= 0; j--, k++)
{
val = (b[i] - '0') * (a[j] - '0') + shift;
if (val >= 10)
{
shift = val / 10;
val = val % 10;
}
else
shift = 0;
tmp[maxlen - 1 - t - k] = '0' + val;
}
if (shift)
tmp[maxlen - 1 - t - k] = '0' + shift;
//print(tmp);
shift = 0;
//计算c与tmp的和
for (k = maxlen - 1; k >= 0; k--)
{
if (tmp[k] == 0)
continue;
else
{
val = c[k] - '0' + tmp[k] - '0' + shift;
if (val >= 10)
{
shift = val / 10;
val = val % 10;
}
else
shift = 0;
c[k] = '0' + val;
}
}
}
movePreZero(c);
}
int main()
{
int n, m;
char a[MAXNUM] = { 0 }, b[MAXNUM] = { 0 }, c[MAXNUM] = { 0 }, d[MAXNUM] = { 0 };
scanf("%s %s", a, b);
bigAdd(a, b, c);
bigMul(a, b, d);
printf("和:");
print(c);
printf("积:");
print(d);
return 0;
}