Saad Anwar
Saad Anwar

Reputation: 41

error in long number addition using character array

The code written below is working out quite fine but gives out only one error which I cannot find out why. When we add numbers like 99+1 or 999+1 it prints only the zeroes but not one. If you point out the error in the code and correct it i would rather be thankful for your help.

#include<stdio.h>
int main()
{
    int num1[255], num2[255], sum[255];
    char s1[255], s2[255];
    int l1, l2,h;

    printf("Enter Number1:");
    scanf("%s", &s1);
    printf("Enter Number2:");
    scanf("%s", &s2);


    for (l1 = 0; s1[l1] != '\0'; l1++)
        num1[l1] = s1[l1] - 48;

    for (l2 = 0; s2[l2] != '\0'; l2++)
        num2[l2] = s2[l2] - 48;

    int carry = 0;
    int k = 0;
    int i = l1 - 1;
    int j = l2 - 1;

    for (; i >= 0 && j >= 0; i--, j--, k++)
    {
        sum[k] = (num1[i] + num2[j] + carry) % 10;
        carry = (num1[i] + num2[j] + carry) / 10;
    }

    if(l1==0 && carry==1)
    {
        sum[k++]=1;
    }
    else if (l1 > l2)
    {
        while (i >= 0)
        {
            sum[k++] = (num1[i--] + carry)%10 ;
            carry = (num1[i]+carry)/10;
        }
        if(i==0&&carry==1)
        {
            sum[k++]=carry;
        }
    }
    else if(l1<l2)
    {
        while (j >= 0)
        {
            sum[k++] = (num2[j--] + carry)%10 ;
            carry = (num2[j]+carry)/10;
        }
        if(j==0&&carry==1)
        {
            sum[k++]=carry;
        }
    }

    printf("Result:");

    for (k--; k>= 0; k--)
        printf("%d", sum[k]);

    return 0;
}

Upvotes: 2

Views: 114

Answers (3)

Shubham Agrawal
Shubham Agrawal

Reputation: 308

Try this code. I think this should help you.

#include<stdio.h>
int main()
{
int num1[255], num2[255], sum[255];
char s1[255], s2[255];
int l1, l2,h;

printf("Enter Number1:");
scanf("%s", &s1);
printf("Enter Number2:");
scanf("%s", &s2);

for (l1 = 0; s1[l1] != '\0'; l1++)
    num1[l1] = s1[l1] - '0';

for (l2 = 0; s2[l2] != '\0'; l2++)
    num2[l2] = s2[l2] - '0';

int carry = 0;
int k = 0;
int i = l1 - 1;
int j = l2 - 1;

for (; i >= 0 && j >= 0; i--, j--, k++)
{
    sum[k] = (num1[i] + num2[j] + carry) % 10;
    carry = (num1[i] + num2[j] + carry) / 10;
}

//if num2 has more digits than num1

if(i==-1 && j>=0)
{  
      while(j>=0)
      {
          sum[k++]=(num2[j]+carry)%10;
          carry=(num2[j]+carry)/10;
          j--;
      }
}

//if num1 has more digits than num2

if(i>=0 && j==-1)
{  
      while(i>=0)
      {
          sum[k++]=(num1[i]+carry)%10;
          carry=(num1[i]+carry)/10;
          i--;
      }
}
 // both has reached to their last digits position and suppose the carry is still left
 if(i==-1 && j==-1)
 { 
    if(carry>0)
      sum[k++]=carry;
 }

printf("Result:");

for (k=k-1; k>= 0; k--)
    printf("%d", sum[k]);

return 0;
}

Upvotes: 0

Rishikesh Raje
Rishikesh Raje

Reputation: 8614

  1. In the while loop (i>=0), you are decrementing the index i in the sum step. You are using this index again in the carry step below. You should decerement it at the next carry step.

  2. The if condition after that, is if(i==0&&carry==1) i will be always -1 at the end of the loop. So the conditionfor i==0 can be removed.

The fixed code is below.

#include<stdio.h>
int main() {
  int num1[255], num2[255], sum[255];
  char s1[255], s2[255];
  int l1, l2,h;

  printf("Enter Number1:");
  scanf("%s", s1);
  printf("Enter Number2:");
  scanf("%s", s2);


  for (l1 = 0; s1[l1] != '\0'; l1++)
    num1[l1] = s1[l1] - 48;

  for (l2 = 0; s2[l2] != '\0'; l2++)
    num2[l2] = s2[l2] - 48;

  int carry = 0;
  int k = 0;
  int i = l1 - 1;
  int j = l2 - 1;
  for (; i >= 0 && j >= 0; i--, j--, k++) {
    sum[k] = (num1[i] + num2[j] + carry) % 10;
    carry = (num1[i] + num2[j] + carry) / 10;
  }
  if(l1==0&&carry==1)
  {
    sum[k++]=1;
  }
  else if (l1 > l2) {

    while (i >= 0) {
      sum[k++] = (num1[i] + carry)%10 ;
      carry = (num1[i--]+carry)/10;
    }
    if(carry==1)
    {
      sum[k++]=carry;
    }
  } else if(l1<l2) {
    while (j >= 0) {
      sum[k++] = (num2[j] + carry)%10 ;
      carry = (num2[j--]+carry)/10;
    }
    if(carry==1)
    {
      sum[k++]=carry;

    }
  }

  printf("Result:");
  for (k--; k>= 0; k--)
    printf("%d", sum[k]);

  return 0;
}

Test1

Enter Number1:99
Enter Number2:2
Result:101

Test2

Enter Number1:22
Enter Number2:99998
Result:100020

Upvotes: 2

Niklas Rosencrantz
Niklas Rosencrantz

Reputation: 26637

You need to write the carry counter, and then read it. You code only needed a minor adjustment for the carry, then it works.

#include <stdio.h>

int main() {
    int num1[255], num2[255], sum[255];
    char s1[255], s2[255];
    int l1, l2;

    printf("Enter Number1:");
    scanf("%s", s1);
    printf("Enter Number2:");
    scanf("%s", s2);    

    for (l1 = 0; s1[l1] != '\0'; l1++)
        num1[l1] = s1[l1] - '0';

    for (l2 = 0; s2[l2] != '\0'; l2++)
        num2[l2] = s2[l2] - '0';

    int carry = 0;
    int k = 0;
    int i = l1 - 1;
    int j = l2 - 1;
    for (; i >= 0 && j >= 0; i--, j--, k++) {
        sum[k] = (num1[i] + num2[j] + carry) % 10;
        carry = (num1[i] + num2[j] + carry) / 10;
    }
    if (l1 > l2) {


        while (i >= 0) {
            sum[k++] = (num1[i] + carry) % 10;
            carry = (num1[i--] + carry) / 10;
        }

        if (sum[k - 1] != carry)
            sum[k++] = carry;

    } else if (l1 < l2) {
        while (j >= 0) {
            sum[k++] = (num2[j] + carry) % 10;
            carry = (num2[j--] + carry) / 10;
        }
        if (sum[k - 1] != carry)
            sum[k++] = carry;
    } else {
        if (carry > 0)
            sum[k++] = carry;
    }


    printf("Result:");
    for (k--; k >= 0; k--)
        printf("%d", sum[k]);

    return 0;
}

Test

Enter Number1:99
Enter Number2:1
Result:100

Test 2

Enter Number1:9999999999999999999999999999999999
Enter Number2:1
Result:10000000000000000000000000000000000

Upvotes: 2

Related Questions