我将尝试编写一个C程序,实现两个数字的乘法而不直接使用乘法运算符,并且它应该考虑到数字足够大,以至于即使这两个数字的常规加法也无法通过直接相加来执行。
当我尝试(并成功地)编写一个使用字符字符串执行加法的C程序时,我受到了启发,我做了以下操作:
现在,(*) 函数可以将 (x1x2...xn) 乘以 y1,且乘以10^(k-1)就是在数字旁边添加 k-1 个零;最后,我们将这些 k 个项相加,得到结果。但难点在于只有知道每个数字包含多少位数,才能在设计用于将它们相加的循环中每次执行加法。我考虑过使用空数组,并每次给它添加由 (x1x2....xn) 与 yi x 10^(i-1) 相乘得到的结果,但正如我所说,我无法确定所需的上下界限,也不知道每次要在获取的结果前面添加多少个零,以便使用上述算法将其添加到空数组中。 当需要进行从 char 类型到 int 类型的多次转换时,更加困难。也许我把它变得比应该更复杂了,我不知道是否有更简单的方法可以完成此任务,或者是否有我不知道的工具。 我是编程的初学者,不知道除基本工具外还有什么东西。
当我尝试(并成功地)编写一个使用字符字符串执行加法的C程序时,我受到了启发,我做了以下操作:
#include<stdio.h>
#define N 100000
#include<string.h>
void pushelts(char X[], int n){
int i, j;
for (j = 0; j < n; j++){
for (i = strlen(X); i >= 0; i--){
X[i + 1] = X[i];
}
X[0] = '0';
}
}
int max(int a, int b){
if (a > b){ return a; }
return b;
}
void main(){
char E[N], F[N]; int C[N]; int i, j, a, b, c, d = 0, e;
printf("Enter the first number: ");
gets_s(E);
printf("\nEnter the second number: ");
gets_s(F);
a = strlen(E); b = strlen(F); c = max(a, b);
pushelts(E, c - a); pushelts(F, c - b);
for (i = c - 1; i >= 0; i--){
e = d + E[i] + F[i] - 2*'0';
C[i] = e % 10; d = e / 10;
}
printf("\nThe answer is: ");
for (i = 0; i < c; i++){
printf("%d", C[i]);
}
getchar();
}
它可以对“N”位数的任意两个数字进行相加。现在,我该如何使用它来执行大数的乘法运算呢?首先,我编写了一个函数,用于将要作为字符字符串输入的数字乘以一个数字n(即0<=n<=9)。很容易看出这样的函数是如何编写的;我将其称为(*)。现在主要目的是将两个数字(按字符字符串输入)相乘。我们可以将第二个数字看作具有k位数字的数字(假设它是a1a2.....ak):
a1a2...ak = a1 x 10^(k - 1) + a2 x 10^(k - 2) + ... + ak-1 x 10 + ak
因此,可以使用为加法设计的解决方案以及功能 (*) 来实现两个数字的乘法。
如果第一个数字是 x1x2.....xn,第二个数字是 y1y2....yk,则:
x1x2...xn x y1y2...yk = (x1x2...xn) x y1 x 10^(k-1) + .....
现在,(*) 函数可以将 (x1x2...xn) 乘以 y1,且乘以10^(k-1)就是在数字旁边添加 k-1 个零;最后,我们将这些 k 个项相加,得到结果。但难点在于只有知道每个数字包含多少位数,才能在设计用于将它们相加的循环中每次执行加法。我考虑过使用空数组,并每次给它添加由 (x1x2....xn) 与 yi x 10^(i-1) 相乘得到的结果,但正如我所说,我无法确定所需的上下界限,也不知道每次要在获取的结果前面添加多少个零,以便使用上述算法将其添加到空数组中。 当需要进行从 char 类型到 int 类型的多次转换时,更加困难。也许我把它变得比应该更复杂了,我不知道是否有更简单的方法可以完成此任务,或者是否有我不知道的工具。 我是编程的初学者,不知道除基本工具外还有什么东西。
是否有任何解决方案、想法或算法可以提供?谢谢。