Cover Image

Wednesday, 1 October 2014

Program that accepts two integers as input and prints their sum as output. Each integer will have at least 25 digits.(Done in Turboc3)


#include<stdio.h>
#include<conio.h>
#include<malloc.h>

struct list
{
                int num;
                struct list *next;
};
typedef struct list node;
void main()
{
                node* getnum(void);
                node* add(node*,node*);
                node* rev_num(node*);
                void putnum(node*);

                node *num1=NULL,*num2=NULL,*sum=NULL;

                clrscr();

                printf("Enter any number : ");
                num1=getnum();
                printf("Enter another number : ");
                pum2=getnum();
                putnum(num1);
                printf(" + ");
                putnum(num2);
                printf(" = ");
                sum=add(num1,num2);
                putnum(sum);
                getch();
}
node* getnum(void)
{
                char *str;
                node *head=NULL,*temp;
                gets(str);
                while(*str!='\0')
                {
                                if(head==NULL)
                                {
                                                head=(node*)malloc(sizeof(node));
                                                head->num=(*str)-'0';
                                                head->next=NULL;
                                                temp=head;
                                }
                                else
                                {
                                                temp->next=(node*)malloc(sizeof(node));
                                                temp->next->num=(*str)-'0';
                                                temp->next->next=NULL;
                                                temp=temp->next;
                                }
                                str++;
                }
                printf("\n");
                return head;
}
void putnum(node *num)
{
                node *temp=num;
                while(temp)
                {
                                printf("%d",temp->num);
                                temp=temp->next;
                }
}
node* rev_num(node *num)
{

                node *temp=num,*nxt,*prev=NULL;

                while(temp!=NULL)
                {
                                nxt=temp->next;
                                temp->next=prev;
                                prev=temp;
                                temp=nxt;
                }
                num=prev;
                return num;
}
node* add(node *num1,node *num2)
{
                int carry=0;
                node *sum=NULL,*temp;
                num1=rev_num(num1);
                num2=rev_num(num2);
                while(num1!=NULL||num2!=NULL)
                {
                                if(sum==NULL)
                                {
                                                sum=(node*)malloc(sizeof(node));
                                                if(num1==NULL) sum->num=num2->num+carry;
                                                else if(num2==NULL) sum->num=num1->num+carry;
                                                else sum->num=num1->num+num2->num+carry;
                                                if(sum->num>=10)
                                                {
                                                                sum->num%=10;
                                                                carry=1;
                                                }
                                                else carry =0;

                                                sum->next=NULL;
                                                temp=sum;

                                }
                                else
                                {
                                                temp->next=(node*)malloc(sizeof(node));
                                                if(num1==NULL) temp->next->num=num2->num+carry;
                                                else if(num2==NULL) temp->next->num=num1->num+carry;
                                                else temp->next->num=num1->num+num2->num+carry;

                                                if(temp->next->num>=10)
                                                {
                                                                temp->next->num%=10;
                                                                carry=1;

                                                }
                                                else carry=0;
                                                temp=temp->next;
                                                temp->next=NULL;
                                }
                                if(num1==NULL) num2=num2->next;
                                else if(num2==NULL) num1=num1->next;
                                else
                                {
                                                num1=num1->next;
                                                num2=num2->next;
                                }

                }
                if(carry)
                {
                                temp->next=(node*)malloc(sizeof(node));
                                temp->next->num=carry;
                                temp=temp->next;
                                temp->next=NULL;
                }

                return sum=rev_num(sum);
}

Output :