⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fds.cpp

📁 两个大整数相加
💻 CPP
字号:
 
# include<stdio.h>
# include<malloc.h>
# include<string.h>
 
# define N 1000
typedef struct data
{
    int dat;
	struct data  *next;
	struct data  *pre;

}dlist,*dli;
void initdlist(dli Q,int c)
{

	Q->next=NULL;
	Q->pre=NULL;
	Q->dat=c;

}
void insertdlist(dli Q, int x)
{
	dlist   *p;
	p=(dlist*)malloc(sizeof(dlist));
	 
 
	
	p->next=Q->next;
if(Q->next!=NULL)
	Q->next->pre=p;
	Q->next=p;
	p->pre=Q;
	p->dat=x;
	

}

bool getnumberdlist(dli Q,int *x)
{
	 dlist *r;

	if(Q->next==NULL)
        return false;
	else
	{
		while(Q->next->next!=NULL)
		{
			Q=Q->next;
		}
		r=Q->next;
		*x=Q->next->dat;
		if(Q->next->next!=NULL)

		 Q->next->next->pre=Q;
		Q->next=r->next;
        free(r);
		return true;
	}

}
void delnumber(dli Q )
{
	 dlist *r;
	 r=Q->next;
	 
		if(Q->next->next!=NULL)

		 Q->next->next->pre=Q;
		Q->next=r->next;
        free(r);

}

char *rightnumber(char *num)
{	 
	while(*num!='\0')
	{
		num++;

	}
	 
	return num;
}//指针右移

int getmark(char *num)
{
	if(*num=='-')
		return -1;
	else
		return 1;
}
 int countnum(char *num)
 {
	 int y;
	  
	 y=strlen( num);
	  
	 if(*num=='-'||*num=='+')
	 return y-1;
	 else 
		 return y;
	 
 }
 int trannumber(char *num)
 { 
	 int number,i=0,t=1,r=0;
	 char* number1;
	 char   n;
	 number1=(char *)malloc(4);
	  number1=rightnumber(num); 
	 while(i<3)
	 {
		 i++;
		  number1--;
      n=*number1; 
	 switch(n)
	 {
		 case '0':
			 number=0;
			 break;
		 case '1':
			 number=1;
			 break;
		 case '2':
			 number=2;
			 break;
	    case '3':
			 number=3;
			 break;
	    case '4':
			 number=4;
			 break;
		case '5':
			 number=5;
			 break;
	    case '6':
			 number=6;
			 break;
		case '7':
			 number=7;
			 break;
	    case '8':
			 number=8;
			 break;
		case '9':
			 number=9;
			 break;
		default:
			number=-1;
			break;
	 }
	 if(number!=-1)
	 {
		 number=r+t*number;
	 r=number;
	 t*=10;
	 }
	 else
		 break;
	 }

	 return  r;
  
 }
void getthree(dli Q,char *num)
 {
	  char *number,*number1;
	  number1=(char*)malloc(3);
	
	unsigned int n=3;
	 int y,t;
	 
	 y=strlen(num)%3;
	 if(*num=='+'||*num=='-')
		 y--;
	 if(y!=0)
	 t=strlen(num)+3-y;
	 else t=t=strlen(num);
	   while(n<=t)
	   {
		  number=(char*)malloc(n*3);
		  
		  strncpy(number,num+strlen(num)-n,n);
		  strncpy(number1,number,3);
	  
	   
		    *(number1+3)='\0';
			insertdlist(Q,trannumber(number1));
	 
	    
	  n+=3;	 
	   } 
}
bool checkbig(dli num1,dli num2)
{   
    while(num1->next !=NULL)
{
		if(num1->next->dat>num2->next->dat)
		 	return true;
		 
		else if(num1->next->dat<num2->next->dat)
			return false;
		else
		{
			num1=num1->next;
		    num2=num2->next;
		}
		return true;


}
	return true;
}
void addtwo(dli num1,dli num2,dli num3)
{  
	int y=0;
	int *n1,*n2;
	n1=(int *)malloc(3);
    n2=(int *)malloc(3);
	int sum=0;
	while(num1->next!=NULL&&num2->next!=NULL)
	{   
		getnumberdlist(num1,n1);
	    getnumberdlist(num2,n2); 
		 sum=(*n1+*n2)%1000+y;
		insertdlist(num3,sum);
		 y=(*n1+*n2+y-sum)/1000;
	  
		 
         
	}
 	 while(num1->next!=NULL||num2->next!=NULL)
	{
		if(getnumberdlist(num1,n1))
		{
			sum=(*n1+y)%1000;
		insertdlist(num3,sum);
		 y=(*n1+y-sum)/1000;
		  
		}
		else if(getnumberdlist(num2,n2))
		{
			sum=*n2%1000+y;
		insertdlist(num3,sum);
		 y=(*n2+y-sum)/1000;
		  
		}


	 } 
 

	  if(y!=0)
		  insertdlist(num3,y);
}
void subtwo(dli num1,dli num2,dli num3)
{
	int y=0;
	int *n1,*n2;
	n1=(int *)malloc(3);
    n2=(int *)malloc(3);
 
	while( num1->next!=NULL&&num2->next!=NULL)
	{
		getnumberdlist(num1,n1);
		getnumberdlist(num2,n2);
		y=*n1-*n2;
		if(y<0)
		{
	  	if(num1->next!=NULL)
			
			{
				while(num1->next!=NULL)
		 
			num1=num1->next;
		 
				num1->dat-=1;
			y+=1000;
			}
			else 
			y=-y;
		}
		insertdlist(num3,y);
		y=0;
			while(num1->pre!=NULL)
		 
			num1=num1->pre;

	}
	    int m;
		while( num1->next!=NULL)

		{
			 getnumberdlist(num1,n1);
			 m=*n1;
		 	if(m<0)
		{
			if(num1->next!=NULL)
			
			{
				while(num1->next!=NULL)
		 
			num1=num1->next;
				num1 ->dat-=1;
			m+=1000;
			}
			else 
			m=-m;
			while(num1->pre!=NULL)
		 
			num1=num1->pre;
		}
		insertdlist(num3,m);
	 
  
		}

}
 
int ii=0;
int fun(dli num)
{ 
if(num->next->dat==0&&ii==0)
	return 3;
	else	if(num->next->dat/100!=0||ii==0)
		{
		ii =1;
			return 0;
		}
		else if(num->next->dat/10!=0 )
		{
			ii =1;	 
		return 1;
		}
		else  
		{
			 	ii =1;
			return 2;
		}
}
void print(dli num)
{
	while(num->next!=NULL)
	{ 	
		switch(fun(num))
		{
		      case 0:	printf("%d",num->next->dat);
			   break;
			   case 1:	printf("0%d",num->next->dat);
			   break;
			   case 2:	printf("00%d",num->next->dat);
			   break;
			    case 3:	printf( "");
			    break;

		}
	
	num=num->next;
 
	}
}
	 void mainf()
{
	dli number1,number2,number3;
	char* num1,*num2 ;
	 
	num1=(char*)malloc(N);
	num2=(char*)malloc(N);
	 
	number1=(dli)malloc(sizeof(dlist));
    number2=(dli)malloc(sizeof(dlist));
    number3=(dli)malloc(sizeof(dlist));
 
	printf("请输入第一个数:");
	gets(num1);
	printf("请输入第二个数:");
	gets(num2);
	 

 
 	initdlist(number1,getmark(num1));
	initdlist(number2,getmark(num2));

 
		getthree(number1,num1);
		getthree(number2,num2);
	 	 
 	if(getmark(num1)==getmark(num2))
    {
		initdlist(number3,getmark(num2));
		addtwo(number1,number2,number3);//
    }
	else
	{
		if(countnum(num1)>countnum(num2))
      
		{
			initdlist(number3,getmark(num1));
			subtwo(number1,number2,number3);
		}
   else if(countnum(num1)<countnum(num2))
	    
   {
	   initdlist(number3,getmark(num2));
	   subtwo(number2,number1,number3);
   }
   else
   {
	   if(checkbig(number1,number2))//================
	   {
		   initdlist(number3,getmark(num1));
		   subtwo(number1,number2,number3);
	   }
	   else 
	   {
		   initdlist(number3,getmark(num2));
		   subtwo(number2,number1,number3);
	   }


   }

	   
	}  
 	 
	printf("结果为:\n");
	if(number3->dat==-1)
		printf("-");
  
	print(number3);
	if(ii==0)
		printf("0");
  printf("\n");
	 } 
	 void main()
	 {
		 while(1)
		 
		 {
			 mainf();
			 ii=0;
		 }
	 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -