长数乘法输出中的错误

时间:2016-05-27 03:52:32

标签: c

我在c中编写了一个用于长数乘法的代码,但输出没有在IDE上显示。请指出给定代码中的错误。哪种语言更有效地解决这些类型的问题?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10000
void main()
{
    char ac[MAX];
    char bc[MAX];
    int a[MAX],b[MAX];
    int mul[MAX];
    int c[MAX];
    int temp[MAX];
    int la,lb;
    int i,j,k=0,x=0,y;
    long int r=0;
    long int sum = 0;
    la=strlen(ac)-1;
    lb=strlen(bc)-1;
    printf("Enter the first number : ");
    scanf("%s",ac);
    printf("Enter the second number : ");
    scanf("%s",bc);

    for(i=0;i<=la;i++){
        a[i] = ac[i] - 48;
    }

    for(i=0;i<=lb;i++){
        b[i] = bc[i] - 48;
    }

    for(i=lb;i>=0;i--){
        r=0;
        for(j=la;j>=0;j--){
            temp[k++] = (b[i]*a[j] + r)%10;
            r = (b[i]*a[j]+r)/10;
        }
        temp[k++] = r;
        x++;
        for(y = 0;y<x;y++){
            temp[k++] = 0;
        }
    }
    k=0;
    r=0;
    for(i=0;i<la+lb+2;i++)
        {
            sum =0;
            y=0;
            for(j=1;j<=lb+1;j++){
                if(i <= la+j){
                    sum = sum + temp[y+i];
                }
                y += j + la + 1 ;
            }
            c[k++] = (sum+r) %10;
            r = (sum+r)/10;
        }
    if (r==1)
        {
            c[k]=r;
        }
    j=0;
    for(i=k-1;i>=0;i--){
        mul[j++]=c[i];

    }

    for(i=0;i<j;j++)
        {
            printf("%d",mul[i]);
        }
}

2 个答案:

答案 0 :(得分:2)

在分配字符串之前计算输入字符串的长度:

la=strlen(ac)-1;
lb=strlen(bc)-1;
printf("Enter the first number : ");
scanf("%s",ac);
printf("Enter the second number : ");
scanf("%s",bc);

如果您改为采用其他方式实际执行此操作:

printf("Enter the first number : ");
scanf("%s",ac);
printf("Enter the second number : ");
scanf("%s",bc);
la=strlen(ac)-1;
lb=strlen(bc)-1;

您的第二个问题出在代码的最后一部分:

for(i=0;i<j;j++)
    {
        printf("%d",mul[i]);
    }

你正在递增j而不是i,它应该是:

for(i=0;i<j;i++)
    {
        printf("%d",mul[i]);
    }

另一件小事,这对于不熟悉的人来说并不是很清楚:

a[i] = ac[i] - 48;

如果你这样写它会更容易理解:

a[i] = ac[i] - '0';

答案 1 :(得分:0)

使用删除那些la和l赋值,并在扫描下面的字符串后放置它。

printf("Enter the first number : ");
scanf("%s",ac);
printf("Enter the second number : ");
scanf("%s",bc);

la=strlen(ac)-1; 
lb=strlen(bc)-1;

for(i=0;i<=la;i++){
        a[i] = ac[i] - 48;
}

for(i=0;i<=lb;i++){
        b[i] = bc[i] - 48;
}

即使在代码的最后部分也存在错误。在您使用的for(i=0;i<j;j++)循环中,将其替换为for(i=0;i<j;i++)

我还建议你将临时数组的大小更改为2 * MAX + 2.因为假设有人输入了8000个数字,那么如果大小仅限于MAX,则temp将无法存储这些数字。

你可以使用java和python语言来做同样的事情。在Java中,有一个名为BigInteger的单独类。

Scanner sc=new Scanner(System.in);
BigInteger b1,b2,b3;
String num1,num2; 

System.out.println("Enter the first integer");
num1=sc.next();

System.out.println("Enter the second integer");
num2=sc.next();

b1=new BigInteger(num1);
b2=new BigInteger(num2);
b3=b1.multiply(b2);

System.out.println("The product of "+b1+" and "+b2+" is "+b3);