P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
第一次画图,略显简陋。
由图可以看出c的小标与x,y下标的关系为x的下标加上y的下标再减一。
由此得到: c [ i + j - 1 ] = x [ i ] * y [ j ]x
cpp
#include<stdio.h>
#include<string.h>
char x[2005];//存储第一个整数,转为字符串方便计数长度和位运算
char y[2005];//存储第二个整数,转为字符串方便计数长度和位运算
int a[2005];//逆序存储第一个整数,方便相同位的运算
int b[2005];//逆序存储第二个整数,方便相同位的运算
int c[4005];//逆序存储结果
int main()
{
scanf("%s", x);
scanf("%s", y);
size_t la = strlen(x);//计算x的长度
size_t lb = strlen(y);//计算y的长度
size_t lc = la + lb;//c的最大长度为x+y
for (int i = 0; i < la; i++)
{
a[la - i] = x[i] - '0';//逆序存储x
}
for (int i = 0; i < lb; i++)
{
b[lb - i] = y[i] - '0';//逆序存储y
}
for (int i = 1; i <= la; i++)
{
for (int j = 1; j <= lb; j++)
{
c[i + j - 1] += a[i] * b[j];//c的第i+j-1位为a的第i位乘b的第j位
c[i + j] += c[i + j - 1] / 10;//如果c的i+j-1位超过10,则i+j位要加上i+j-1位的十位
c[i + j - 1] %= 10;//i+j-1位只留下个位
}
}
while (c[lc] == 0&&lc>0)
{//数字是倒序存储,所以前面可能出现0
lc--;//去除前面可能出现的0
}
for (size_t i = lc; i > 0; i--)
{
printf("%d", c[i]);//逆序打印
}
if (x[0] == '0' || y[0] == '0')
{
printf("0");//如果有一个数是0,会被前面的去除前面的0的步骤删除,所以要单独打印
}
return 0;
}