c语言单链表实现大数的四则运算

它运行不了

它运行不了

它运行不了,不知道为什么

运行加,减之后后面就不输出了,想吐

思路是,创建两个链表头插法(方便计算),每一个节点储存一位数

加法是对应的位数相加,判断是否进位,向后循环

减法跟加法差不都,依次相减,判断是否向高位借1,结果符号要单独判断‘

乘法使用两个循环,分别用一组数的每一位循环×另一组数的每一位,注意乘完放入的位次

除法先判断两数大小  a==b,a<b,直接输出结果

a>b,a=a-b直到a<b,减的次数是商,余数是a

#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct LNode
{
	int data;//注意类型    选择int  或者char都可以  
	struct LNode *next;
 } LinkList;

	static int fuhao=1;//定义一个全局变量  判断符号 
int ListLength(LinkList *head)//求链表长度     有效长度 
{
	LinkList *p=head->next;
	int i=0;
	while(p!=NULL)
	{
		i++;
		p=p->next;
	}
	return(i);
}
int GetElem(LinkList *head,int i)//求第i个数,并返回到e中 
{
	int j=1;
	LinkList *p=head->next;
	while(p!=NULL&&j<i)
	{
	    j++;
		p=p->next;	
	}
	if(p==NULL)
	  return 0;
	else
	{
		//*e=p->data;
		return p->data;
	}
 } 
 int add(LinkList *head1,LinkList *head2,int m,int n)//加函数 
 {
 	int j,k,d;
 	j=m>n?m:n;//最大 
	k=n>m?m:n;//小 
 	LinkList *head3,*s;
 	int i;
 	int flag;
 	
 	 LinkList *p,*q,*r;
     p=head1->next;
     q=head2->next;
 	 head3=(LinkList*)malloc(sizeof(LinkList));//创建第三个链表储存结果 
	 head3->next=NULL; 
	 
	  flag=0;
	  for(i=0;i<k;i++)
	  {
	  
	  	s=(LinkList*)malloc(sizeof(LinkList));
	  	s->next=head3->next; 
	    head3->next=s;
	  	//((p->data+q->data+flag)>9)
	  	  // {
			d=p->data+q->data+flag;
			flag=d/10;//进位 
			s->data=d%10;//取余 
	  	q=q->next ;
	  	p=p->next ;
	  }
	  while(i<n)
	  {//n  第一个长 
	   	s=(LinkList*)malloc(sizeof(LinkList));
        s->next=head3->next; 
	    head3->next=s;
	   	d=p->data+flag;
		flag=d/10;//进位 
		s->data=d%10;//取余 
        p=p->next ; 
        i++;
       }
     while(i<m)
	 {//m   第二个长 
	 	s=(LinkList*)malloc(sizeof(LinkList));
        s->next=head3->next; 
	    head3->next=s;
       	d=q->data+flag;
		flag=d/10;//进位 
		s->data=d%10;//取余 
        q=q->next ; 
        i++;
	}
    r=head3->next ;
	for(i=0;i<j;i++)
	{
	    printf("%d",r->data );
	    r=r->next; 
	} 	   
	printf("\n"); 
 	return 0; 
 }
 LinkList* sub(LinkList *head1,LinkList *head2,int m,int n,int l)
 {
 	//printf("两数之差为\n");
 	if(l==0) 
 	{
 		printf("差为0"); //两数相等  差为零 
	 }
	int j,k,d;
	char f;//f表示符号 
 	j=m>n?m:n;//最大 
	k=n>m?m:n;//小 
 	LinkList *head3,*s;
 	int i;
 	int flag;
 	LinkList *p,*q,*r;
 	
	 if(n>m){
 	 //LinkList *p,*q,*r;
     p=head1->next;
     q=head2->next;
 	head3=(LinkList*)malloc(sizeof(LinkList));//创建第三个链表储存结果 
	  head3->next=NULL; 
	 
	  flag=0;
	  for(i=0;i<k;i++)
	  {
	  
	  	s=(LinkList*)malloc(sizeof(LinkList));
	  	s->next=head3->next; 
	    head3->next=s;
	  	//((p->data+q->data+flag)>9)
	  	  // {
			d=p->data-q->data+flag;
	 		if(d<0)
	         		{flag=-1;//向高位借一
					 s->data =d+10;
					  
			} 
			else
			{
				flag=0;
				s->data =d;
			}
	  	q=q->next ;
	  	p=p->next ;
	  }
	  
	  
	  while(i<n)
	  {//n  第一个长 
	   	s=(LinkList*)malloc(sizeof(LinkList));
        s->next=head3->next; 
	    head3->next=s;
	   	d=p->data+flag;
	   		if(d<0)
	         		{flag=-1;//向高位借一
					 s->data =d+10;
					  
			} 
			else
			{
				flag=0;
				s->data =d;
			}
		//flag=d/10;//进位 
		//s->data=d;//取余 
	   
        p=p->next ; 
        i++;
        //f='+';  
       }
   }
     /*while(i<m)
	 {//m   第二个长 
	 	s=(LinkList*)malloc(sizeof(LinkList));
        s->next=head3->next; 
	    head3->next=s;
       	d=q->data+flag;
       		if(d<0)
	         		{flag=-1;//向高位借一
					 s->data =d+10;
					  
			} 
			else
			{
				flag=0;
				s->data =d;
			}
		//flag=d/10;//进位 
		//s->data=d;//取余 
	
        q=q->next ; 
        i++;
        f='-';
	}
        */
    //printf("%c",f);
    else
	{
		
		 q=head1->next;
     p=head2->next;
  
	  flag=0;
	  for(i=0;i<k;i++)
	  {
	  
	  	s=(LinkList*)malloc(sizeof(LinkList));
	  	s->next=head3->next; 
	    head3->next=s;
	  	//((p->data+q->data+flag)>9)
	  	  // {
			d=p->data-q->data+flag;
	 		if(d<0)
	         		{flag=-1;//向高位借一
					 s->data =d+10;
					  
			} 
			else
			{
				flag=0;
				s->data =d;
			}
	  	q=q->next ;
	  	p=p->next ;
	  }
	  
	  
	  while(i<m)
	  {//n  第一个长 
	   	s=(LinkList*)malloc(sizeof(LinkList));
        s->next=head3->next; 
	    head3->next=s;
	   	d=p->data+flag;
	   		if(d<0)
	         		{flag=-1;//向高位借一
					 s->data =d+10;
					  
			} 
			else
			{
				flag=0;
				s->data =d;
			}
		//flag=d/10;//进位 
		//s->data=d;//取余 
	   
        p=p->next ; 
        i++;
        //f='+';  
       }
   
		fuhao=0;
	 } 
	 
   /* r=head3->next;
	for(i=0;i<j;i++)
	{
	    printf("%d",r->data );
	    r=r->next; 
	} 	   
 	return 0;*/ 
 	//printf("两数之差为"); 
 	return head3;
 }
 int ride(LinkList *head1,LinkList *head2,int m,int n)
 {
 	int l1,l2,d;
 	int j,z,k;
 	z=m>n?m:n;//最大 
	//k=n>m?m:n;//小 
 	LinkList *head3,*s;
 	int i=0;
 	int flag;
 	
 	 LinkList *p,*q,*r;
     p=head1->next;
     q=head2->next;
 	   head3=(LinkList*)malloc(sizeof(LinkList));//创建第三个链表储存结果 
	   head3->next=NULL; //初始化 
	   while(i<m+n)
	   {
	  	s=(LinkList*)malloc(sizeof(LinkList));//创建第三个链表储存结果 
	  	s->next=head3->next; 
	    head3->next=s;
	    s->data=0;//初始赋0 
	    i++;
		}	 
		s=head3;
	  for(i=0;i<m;i++)
	    {//第一层循环 
        flag=0;
        
            for(k=0;k<i+1;k++)
            {
        	   s=s->next ;//放在合适 
		    }
          
        for(j=0;j<n;j++)
		   {//第二次循环 
            d=p->data*q->data+flag;
            s->data+=( s->data+d)%10;//保存本位 
            flag=( s->data+d)/10;//进位 
            p=p->next ;
	  	    s=s->next ; 
           }
           if(flag>0)
		   {
            s->data=flag;//判断最后一次是否有进位 
            //j++;//j是表示长度 
           }
           q=q->next ;
           s=head3;
           p=head1->next ;
	    }   
      r=head3->next;
//	   if(fuhao==0)
//	      printf("-");
	  for(i=0;i<z;i++)
	  {
	    printf("%d",r->data );
	     r=r->next; 
	  } 	
 	
 }
 int divide(LinkList *head1,LinkList *head2,int m,int n,int l,char a[])
 {
 	//char u[];
 	LinkList *p,*q,*r,*t;
 	char *a1,*b1;
 	int i,j,k;
 	i=0;
	j=m>n?m:n;//最大 
 	if(l==0) //两数相等 
 	 { 
 		printf("商为1  余数为0\n"); 
	 }
	 if(l<0)//第一个数小于第二个数 
	 {
	 	printf("商为0   余数为"); 
	 	printf("%s",a);
	 } 
	 //第一个数大于第二个数 
	 else
	 {  while(1) 
	    {
	    	//t=head1;
	 	  head1=sub(head1,head2,m,n,l);
	 	  i++;
	 	  if(ListLength(head2)>ListLength(head1) ) //第一个数比第二个短 
	 	   break;
	 	  if(ListLength(head2)==ListLength(head1) ) //两个数一样长 
	 	   {
	 	   	k=ListLength(head2);
	 	   	for(i=0;i<k;i++)
	 	   	   {
	 	   	   	//GetElem(head1,k-i-1);//倒序循环  比较两数大小 
	 	   	   	//GetElem(head2,k-i-1);
	 	   	   	if(GetElem(head1,k-i-1)<GetElem(head2,k-i-1))
	 	   	   	   break;
				}
	 	   	
			}
	 	   
	 	   printf("商为%d,余数为 ",i);
	      r=head1->next;
	     for(i=0;i<j;i++)
	     {
	       printf("%d",r->data );
	       r=r->next; 
	     } 	   
	    } 	   
	}
	 /*printf("商为%d,余数为 ",i);
	      r=head1->next;
	     for(i=0;i<j;i++)
	   {
	       printf("%d",r->data );
	       r=r->next; 
	   } 	   
	 } */ 
 }
 int main()
 {
 	LinkList *head1,*head2,*s,*r;
 	printf("请输入两组大数");
 	int i,j,n,m,k,l;
 	
 	//static int fuhao=1;
 	char a[100];
 	scanf("%s",a);
 	n=strlen(a);
 	//int a[100];
	/*do{
        i=0;
	 	scanf("%d",&a[i]);
	 	printf("%d",a[i]);
		 //循环数组接受大数 
	 	n=i+1;
		 i++;            //n是长度 
	  } 
	  while(a[i]);
	  for(i=n;i<100;i++)
             a[i]=0;
             */
	  head1=(LinkList*)malloc(sizeof(LinkList));
	  head1->next=NULL; 
	  for(i=0;i<n;i++)
	  {
	  	s=(LinkList*)malloc(sizeof(LinkList));
	  	//s->data=a[i];
	  	s->data=a[i]-'0';
	  	//printf("%d",s->data);
	  	s->next=head1->next;
	  	head1->next=s;
	  } 

      char b[100];
 	  scanf("%s",b);
 	  m=strlen(b);
	  head2=(LinkList*)malloc(sizeof(LinkList));
	  head2->next=NULL; 
	  for(i=0;i<m;i++)
	  {
	  	s=(LinkList*)malloc(sizeof(LinkList));
	  	s->data=b[i]-'0';
	  	//printf("%d",s->data);
		  //canf("%c",&s->data);
		  //s->data=a[i];
	  	s->next=head2->next;
	  	head2->next=s;
	  }

	  
	  
	  printf("两数之和为\n"); 
	  add(head1,head2,m,n);//调用add函数 
	  l=strcmp(a,b); 
	  printf("两数之差为\n");
	  
	   r=sub(head1,head2,m,n,l)->next;
	     if(fuhao==0)
	     {
	        printf("-");
	     }
	     for(i=0;i<j;i++)
	    {
	       printf("%d",r->data);
	       r=r->next; 
	    } 	
		r=NULL; 
		
		  
		  
		  
		  
		  
		  
	  printf("测\n");
	  printf("两数之积为\n");
	 ride(head1,head2,m,n); 
	  
	 
	  printf("\n");
	  divide(head1,head2,m,n,l,a);

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值