2016-05-27 60 views
0

我已經在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]); 
     } 
} 
+0

有任意精度的數學庫。 – Barmar

+0

Python和Lisp具有內置的任意精度算法。 – Barmar

+0

@barmar感謝您的信息。但如果你幫我解決這個錯誤,我會很高興。 –

回答

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]); 
    } 

你遞增,而不是I J,它應該是:

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

另一個小東西,這是不是真的清楚什麼,它對新手來說:如果你寫

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

它是這樣的它更容易理解:

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

即使「發起」更喜歡' - '0' - 神奇的數字是**糟糕的**。 – Barmar

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; 
} 

即使是在你的代碼的最後一部分有一個error.Inside您使用for(i=0;i<j;j++)for(i=0;i<j;i++)取代它的​​循環。

我也建議你將temp數組的大小改爲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); 
+0

strlen()上的-1應該在那裏,他在for循環的比較部分使用<=。 – Puppe

+0

感謝您的幫助兄弟! –