【发布时间】:2020-05-11 15:16:00
【问题描述】:
我正在尝试将保存在两个 1d 数组中的两个数字相乘。在我将它们保存在二维数组中之后(就像我们在标准乘法中所做的那样),输出不是我所期望的。 这是我到目前为止所做的事情
int main()
{
int n, m, i, j;
printf("Enter multiplicand(n) size: ");
scanf("%d", &n);
printf("Enter multiplier(m) size: ");
scanf("%d", &m);
int a[n], b[m];
printf("Enter multiplicands: ");
for(i = 0; i<n; i++)
{
scanf("%d", &a[i]);
}
printf("Enter multipliers: ");
for(i = 0; i<m; i++)
{
scanf("%d", &b[i]);
}
int c[m][n+m];
int k = 0 , l = m+n-1 , p = 2;
int ans = 0, carry = 0;
for(i = 0; i<m; i++)
{
for(j = 0; j<m+n; j++)
{
c[i][j] = 0;
}
}
for(i = m-1; i>=0; i--)
{
for(j = n-1; j>=0; j--)
{
if(a[j]*b[i] < 10)
{
c[k][l] = a[j]*b[i];
l--;
}
else if(carry > 0 && a[j]*b[i] < 10)
{
ans = a[j]*b[i] + carry;
c[k][l] = ans;
carry--;
l--;
}
else if(carry > 0 && a[j]*b[i] > 10)
{
ans = a[j]*b[i]%10 + carry;
c[k][l] = ans;
l--;
}
else if(carry > 0 && a[j]*b[i] == 10)
{
ans = (a[j]*b[i])%10 + carry;
c[k][l] = ans;
carry++;
l--;
}
else
{
ans = a[j]*b[i]%10;
c[k][l] = ans;
carry++;
l--;
}
}
l = m+n-p;
p++;
k++;
carry = 0;
ans = 0;
}
for(i = 0; i<m; i++)
{
for(j = 0; j<m+n; j++)
{
printf("%d ", c[i][j]);
}
printf("\n");
}
}
如果我将 594 乘以 232,我应该得到:
0 0 1 1 8 8
0 1 7 8 2 0
1 1 8 8 0 0
但程序正在返回:
0 0 0 1 8 8
0 0 6 8 2 0
0 1 8 8 0 0
【问题讨论】:
-
看起来
carry的结果超出了需要。也许你需要重置carry(到0?)(我没有仔细研究你的代码)。 -
您可能想阅读以下内容:How to debug small programs
-
不是你的答案,但是你可以像这样初始化你的数组
int c[m][n+m]={ 0 };,而不是for循环 -
@muhammed VLA 无法初始化,OP 可以执行
memset(c, 0, sizeof c);这很可能是for循环转换为的内容。
标签: c arrays multidimensional-array numbers