please help!!!!!
I wrote this program to calculate addtition and subtraction of two large numbers (maximum 100 digit)
it won't work for minus numbers :(
i know it have problems but i couldn't fix them,please help me for fixing this :)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,d=0,la,lb,max,ia,ib,ix,iy;
    char a[100],b[100],pos[101],neg[101],x[100],y[100];
    printf("Enter First Number: \n");
    scanf("%s",a);
    printf("Enter Second Number: \n");
    scanf("%s",b);
    for(i=0;a[i]!='\0';i++)
        x[i]=a[i];
    x[i]='\0';
    for(i=0;b[i]!='\0';i++)
        y[i]=b[i];
    y[i]='\0';
    for(i=0; a[i]!='\0';i++);
        la=i;
    for(i=0; b[i]!='\0';i++);
        lb=i;
    if(la>lb)
        max=la;
    else
        max=lb;
    ia=la-1;
    ib=lb-1;
    ix=ia;
    iy=ib;
    for(i=max;i>=0;i--)
    {
            if(ia==-1)
            {
                ia=0;
                a[ia]='0';
            }
            if(ib==-1)
            {
                ib=0;
                b[ib]='0';
            }
            pos[i]=((a[ia]-48)+(b[ib]-48)+d)%10;
            d=((a[ia]-48)+(b[ib]-48)+d)/10;
            ia--;
            ib--;
    }
    printf("a+b=");
    if(pos[0]!=0)
        for(i=0;i<=max;i++)
        {
            printf("%d",pos[i]);
        }
    else if(pos[0]==0)
        for(i=1;i<=max;i++)
        {
            printf("%d",pos[i]);
        }
    printf("\n");
    for(i=max;i>=0;i--)
    {
            if(ix==-1)
            {
                ix=0;
                x[ix]='0';
            }
            if(iy==-1)
            {
                iy=0;
                y[iy]='0';
            }
            if((x[ix]-48)-(y[iy]-48)<0)
            {
                x[ix]+=10;
                x[ix-1]-1;
                neg[i]=(x[ix]-48)-(y[iy]-48);
                ix--;
                iy--;
            }
            else
            {
                neg[i]=(x[ix]-48)-(y[iy]-48);
                ix--;
                iy--;
            }
    }
    printf("a-b=");
    if(pos[0]!=0)
        for(i=0;i<=max;i++)
            printf("%d",neg[i]);
    else if(pos[0]==0)
        for(i=1;i<=max;i++)
            printf("%d",neg[i]);
    return 0;
}

Recommended Answers

All 2 Replies

Arbitrary precision math. An interesting problem. Look at the source code for the Boost libraries. I worked on this about 30 years ago and gave up for lack of time (ie, I got a job).

Figured it myself :|

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,d=0,la,lb,max,ia,ib,ix,iy,m,ic,iv;
    char a[100],b[100],pos[101],neg[101],x[100],y[100],c[100],v[100];
    printf("Enter First Number: \n");
    scanf("%s",a);
    printf("Enter Second Number: \n");
    scanf("%s",b);
    for(i=0;a[i]!='\0';i++)
    {
        x[i]=a[i];
        c[i]=a[i];
    }
    x[i]='\0';
    c[i]='\0';
    for(i=0;b[i]!='\0';i++)
    {
        y[i]=b[i];
        v[i]=b[i];
    }
    y[i]='\0';
    v[i]='\0';
    for(i=0; a[i]!='\0';i++);
        la=i;
    for(i=0; b[i]!='\0';i++);
        lb=i;
    if(a[0]=='-')
        la--;
    if(b[0]=='-')
        lb--;
    if(la>lb)
        max=la;
    else
        max=lb;
    ia=la-1;
    ib=lb-1;
    ix=ia;
    iy=ib;
    ic=ia;
    iv=ib;


    //Removing Minus from Negative Numbers

    if(a[0]=='-')
    {
        for(i=0;i<=la;i++)
        {
            x[i]=x[i+1];
            c[i]=c[i+1];
        }
    }
    if(b[0]=='-')
    {
        for(i=0;i<=lb;i++)
        {
            y[i]=y[i+1];
            v[i]=v[i+1];
        }
    }



    //which number is bigger?!
    if(la>lb)
        m=1;
    else if(lb>la)
        m=2;
    else if(la==lb)
    {
        for(i=0;i<max;i++)
            if(x[i]!=y[i])
                break;
        if(x[i]>y[i])
            m=1;
        else
            m=2;
    }



    //Addition


    //Both Positive
    if(a[0]!='-'&&b[0]!='-')
    {
    for(i=max;i>=0;i--)
    {
            if(ic==-1)
            {
                ic=0;
                c[ic]='0';
            }
            if(iv==-1)
            {
                iv=0;
                v[iv]='0';
            }
            pos[i]=((c[ic]-48)+(v[iv]-48)+d)%10;
            d=((c[ic]-48)+(v[iv]-48)+d)/10;
            ic--;
            iv--;
    }
    printf("a+b=");
    if(pos[0]!=0)
        for(i=0;i<=max;i++)
        {
            printf("%d",pos[i]);
        }
    else if(pos[0]==0)
        for(i=1;i<=max;i++)
        {
            printf("%d",pos[i]);
        }
    printf("\n");
    }

    //Both Negative
    if(a[0]=='-'&&b[0]=='-')
    {
    for(i=max;i>=0;i--)
    {
            if(ic==-1)
            {
                ic=0;
                c[ic]='0';
            }
            if(iv==-1)
            {
                iv=0;
                v[iv]='0';
            }
            pos[i]=((c[ic]-48)+(v[iv]-48)+d)%10;
            d=((c[ic]-48)+(v[iv]-48)+d)/10;
            ic--;
            iv--;
    }
    printf("a+b=-");
    if(pos[0]!=0)
        for(i=0;i<=max;i++)
        {
            printf("%d",pos[i]);
        }
    else if(pos[0]==0)
        for(i=1;i<=max;i++)
        {
            printf("%d",pos[i]);
        }
    printf("\n");
    }

    //one Negative other Positive
    if(a[0]=='-'&&b[0]!='-'||a[0]!='-'&&b[0]=='-')
    {
    if(m==1)
    {
        for(i=max;i>=0;i--)
        {
            if(ic==-1)
            {
                ic=0;
                c[ic]='0';
            }
            if(iv==-1)
            {
                iv=0;
                v[iv]='0';
            }
            if((c[ic]-48)-(v[iv]-48)<0)
            {
                c[ic]+=10;
                c[ic-1]-=1;
                pos[i]=(c[ic]-48)-(v[iv]-48);
                ic--;
                iv--;
            }
            else
            {
                pos[i]=(c[ic]-48)-(v[iv]-48);
                ic--;
                iv--;
            }
         }
         if(a[0]!='-')
         {
            printf("a+b=");
            if(pos[0]!=0)
                 for(i=0;i<=max;i++)
                      printf("%d",pos[i]);
            else if(pos[0]==0)
                 for(i=1;i<=max;i++)
                      printf("%d",pos[i]);
            printf("\n");
         }
         else
         {
            printf("a+b=-");
            if(pos[0]!=0)
                 for(i=0;i<=max;i++)
                      printf("%d",pos[i]);
            else if(pos[0]==0)
                 for(i=1;i<=max;i++)
                      printf("%d",pos[i]);
            printf("\n");
         }
    }
    else if(m==2)
    {
        for(i=max;i>=0;i--)
        {
            if(ic==-1)
            {
                ic=0;
                c[ic]='0';
            }
            if(iv==-1)
            {
                iv=0;
                v[iv]='0';
            }
            if((v[iv]-48)-(c[ic]-48)<0)
            {
                v[iv]+=10;
                v[iv-1]-=1;
                pos[i]=(v[iv]-48)-(c[ic]-48);
                ic--;
                iv--;
            }
            else
            {
                pos[i]=(v[iv]-48)-(c[ic]-48);
                ic--;
                iv--;
            }
        }
         if(b[0]!='-')
         {
            printf("a+b=");
            if(pos[0]!=0)
                 for(i=0;i<=max;i++)
                      printf("%d",pos[i]);
            else if(pos[0]==0)
                 for(i=1;i<=max;i++)
                      printf("%d",pos[i]);
            printf("\n");
         }
         else
         {
            printf("a+b=-");
            if(pos[0]!=0)
                 for(i=0;i<=max;i++)
                      printf("%d",pos[i]);
            else if(pos[0]==0)
                 for(i=1;i<=max;i++)
                      printf("%d",pos[i]);
            printf("\n");
         }

    }
    }



    //Subtraction

    //Both Positive
    if(a[0]!='-'&&b[0]!='-')
    {
    if(m==1)
    {
        for(i=max;i>=0;i--)
        {
            if(ix==-1)
            {
                ix=0;
                x[ix]='0';
            }
            if(iy==-1)
            {
                iy=0;
                y[iy]='0';
            }
            if((x[ix]-48)-(y[iy]-48)<0)
            {
                x[ix]+=10;
                x[ix-1]-=1;
                neg[i]=(x[ix]-48)-(y[iy]-48);
                ix--;
                iy--;
            }
            else
            {
                neg[i]=(x[ix]-48)-(y[iy]-48);
                ix--;
                iy--;
            }
         }
         printf("a-b=");
             if(neg[0]!=0)
                 for(i=0;i<=max;i++)
                      printf("%d",neg[i]);
            else if(neg[0]==0)
                 for(i=1;i<=max;i++)
                      printf("%d",neg[i]);
        printf("\n");
    }
    else if(m==2)
    {
        for(i=max;i>=0;i--)
        {
            if(ix==-1)
            {
                ix=0;
                x[ix]='0';
            }
            if(iy==-1)
            {
                iy=0;
                y[iy]='0';
            }
            if((y[iy]-48)-(x[ix]-48)<0)
            {
                y[iy]+=10;
                y[iy-1]-=1;
                neg[i]=(y[iy]-48)-(x[ix]-48);
                ix--;
                iy--;
            }
            else
            {
                neg[i]=(y[iy]-48)-(x[ix]-48);
                ix--;
                iy--;
            }
        }
         printf("a-b=-");
             if(neg[0]!=0)
                 for(i=0;i<=max;i++)
                      printf("%d",neg[i]);
            else if(neg[0]==0)
                 for(i=1;i<=max;i++)
                      printf("%d",neg[i]);
            printf("\n");

    }
    }

    //Both Negative
    if(a[0]=='-'&&b[0]=='-')
    {
    if(m==1)
    {
        for(i=max;i>=0;i--)
        {
            if(ix==-1)
            {
                ix=0;
                x[ix]='0';
            }
            if(iy==-1)
            {
                iy=0;
                y[iy]='0';
            }
            if((x[ix]-48)-(y[iy]-48)<0)
            {
                x[ix]+=10;
                x[ix-1]-=1;
                neg[i]=(x[ix]-48)-(y[iy]-48);
                ix--;
                iy--;
            }
            else
            {
                neg[i]=(x[ix]-48)-(y[iy]-48);
                ix--;
                iy--;
            }
         }
         printf("a-b=-");
             if(neg[0]!=0)
                 for(i=0;i<=max;i++)
                      printf("%d",neg[i]);
            else if(neg[0]==0)
                 for(i=1;i<=max;i++)
                      printf("%d",neg[i]);
    }
    else if(m==2)
    {
        for(i=max;i>=0;i--)
        {
            if(ix==-1)
            {
                ix=0;
                x[ix]='0';
            }
            if(iy==-1)
            {
                iy=0;
                y[iy]='0';
            }
            if((y[iy]-48)-(x[ix]-48)<0)
            {
                y[iy]+=10;
                y[iy-1]-=1;
                neg[i]=(y[iy]-48)-(x[ix]-48);
                ix--;
                iy--;
            }
            else
            {
                neg[i]=(y[iy]-48)-(x[ix]-48);
                ix--;
                iy--;
            }
        }
         printf("a-b=");
             if(neg[0]!=0)
                 for(i=0;i<=max;i++)
                      printf("%d",neg[i]);
            else if(neg[0]==0)
                 for(i=1;i<=max;i++)
                      printf("%d",neg[i]);

    }
    }

    //one Negative other Positive
    if(a[0]=='-'&&b[0]!='-'||a[0]!='-'&&b[0]=='-')
    {
    for(i=max;i>=0;i--)
    {
            if(ix==-1)
            {
                ix=0;
                x[ix]='0';
            }
            if(iy==-1)
            {
                iy=0;
                y[iy]='0';
            }
            neg[i]=((x[ix]-48)+(y[iy]-48)+d)%10;
            d=((x[ix]-48)+(y[iy]-48)+d)/10;
            ix--;
            iy--;
    }
    if(a[0]!='-')
    {
    printf("a-b=");
    if(neg[0]!=0)
        for(i=0;i<=max;i++)
        {
            printf("%d",neg[i]);
        }
    else if(neg[0]==0)
        for(i=1;i<=max;i++)
        {
            printf("%d",neg[i]);
        }
    }
    else
    {
    printf("a-b=-");
    if(neg[0]!=0)
        for(i=0;i<=max;i++)
        {
            printf("%d",neg[i]);
        }
    else if(neg[0]==0)
        for(i=1;i<=max;i++)
        {
            printf("%d",neg[i]);
        }
    }

    }
        return 0;
}
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.