通过模拟乘法竖式运算得到结果
#include <stdio.h>
char num1[2002];
char num2[2002];
char ans[4004];
void swap(char *a, char *b)
{
char temp = *a;
*a = *b;
*b = temp;
}
void reverse(char *str)
{
char *temp = str;
while (*temp)
{
temp++;
}
while (str < temp)
{
swap(str++, --temp);
}
}
void multy()
{
//先将两个乘数翻转以方便运算
reverse(num1);
reverse(num2);
char *tb = num2;
int ansPtr = 0;
char *tans;
while (*tb) //当乘数当前位不是0时运算
{
tans = ans + ansPtr; //记录本轮运算结果记录的起始位置
char *ta = num1;
int k = 0; //进位
while (*ta || k) //当被乘数当前位或进位不为0时运算
{
if (*tans) //如果结果中由上次运算得到的字符0,将其转为数字0
{
*tans -= 0x30;
}
//运算
*tans += (*ta != 0 ? *ta - 0x30 : 0) * (*tb - 0x30) + k;
k = *tans / 10;
*tans = *tans % 10 + 0x30;
ta++;
tans++;
}
ansPtr++;
tb++;
}
//由于运算是倒着将两个字符串相加,因此结果字符串也是倒着的,将其正过来
reverse(ans);
//删除前导0
tans = ans;
if (*tans == '0')
{
while (*(++tans) == '0')
{
*tans = 0;
}
}
}
int main()
{
scanf("%s%s", num1, num2);
multy();
puts(ans);
}