题目描述
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
输入描述:
空格分隔的两个字符串,代表输入的两个大整数
输出描述:
输入的乘积,用字符串表示
示例1
输入
72106547548473106236 982161082972751393
输出
70820244829634538040848656466105986748
思路:两个M*N位的数相乘
1.字符串数组字符char类型的数字 - '0'后,数值就等于字符char类型的数字值,所以运算的时候可以用pocky[i]-'0'进行计算
2.不考虑进位,在输出结果中,每一位都相加。如123456*123456,如下表最后一行
1 | 2 | 3 | 4 | 5 | 6 | |||||
× | 1 | 2 | 3 | 4 | 5 | 6 | ||||
6 | 12 | 18 | 24 | 30 | 36 | |||||
5 | 10 | 15 | 20 | 25 | 30 | |||||
4 | 8 | 12 | 16 | 20 | 24 | |||||
3 | 6 | 9 | 12 | 15 | 18 | |||||
2 | 4 | 6 | 8 | 10 | 12 | |||||
1 | 2 | 3 | 4 | 5 | 6 | |||||
1 | 4 | 10 | 20 | 35 | 56 | 70 | 76 | 73 | 60 | 36 |
3.从个位(M+N-1)开始考虑进位,到第一位(1),(第一位也要进位,就会进位到pocky[0],这就是预留pocky[0]的原因)
4.字符串数组的每个元素 + '0'。输出。
#include <stdio.h>
#include <string.h>
int main(void)
{
int i, j, k, l, len1, len2 = 0;
char str1[1000] = { 0 };
char str2[1000] = { 0 };
int pocky[1000] = { 0 };
char pocky1[1000] = { 0 };
char s[1000] = { 0 };
scanf("%s%s", &str1, &str2);
len1 = strlen(str1);
len2 = strlen(str2);
for (i = 0; i < len1; i++)
{
for (j = 0; j < len2; j++)
{
pocky[i + j + 1] += (str1[i] - '0') * (str2[j] - '0');
}
}
for (k = len1 + len2 - 1; k >0; k--)
{
if (pocky[k] > 10)
{
pocky[k - 1] += pocky[k] / 10;
pocky[k] = pocky[k] % 10;
}
}
for (l = 0; l<len1 + len2; l++)
{
pocky1[l] = pocky[l] + '0';
}
printf("%s", pocky1);
return 0;
}