【问题标题】:Trying to multiply two numbers using Standard Multiplication Method and Arrays尝试使用标准乘法方法和数组将两个数字相乘
【发布时间】: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


【解决方案1】:

当进位存在但内部循环完成时,您没有处理这种情况 使用这个

    if(carry>0){
        c[k][l] = carry;
    }

最后,对您的代码进行小的修改 我只用 3 位数字对其进行了测试,这可能会有所帮助。

for(i = m-1; i>=0; i--)
    {
        for(j = n-1; j>=0; j--)
        {
            if(a[j]*b[i] < 10 && carry==0)
            {
                c[k][l] = a[j]*b[i];
                l--;
            }
            else if(carry > 0)
            {
                ans = a[j]*b[i] + carry;
                c[k][l] = ans%10;
                carry=ans/10;
                l--;
            }
            else
            {
                ans = a[j]*b[i]%10;
                c[k][l] = ans;
                carry=a[j]*b[i]/10;
                l--;
            }
        }
        if(carry>0){
            c[k][l] = carry;
        }
        l = m+n-p;
        p++;
        k++;
        carry = 0;
        ans = 0;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2018-07-16
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多