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

📄 kk.txt

📁 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.
💻 TXT
字号:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#include <conio.h>

struct DuLNode{
    struct DuLNode *prior; 
    int data;
    struct DuLNode *next;  
}*DuLink[2];   //双向循环链表结点结构定义体

int NodeNum[2]={0,0};  //长整数的节数,循环链表的结点计数器

struct DuLNode *Build_BDCL(int k);	
//该函数体用来形成双向循环链表,用以存放万进制格式的长整数

void main()
{
	struct DuLNode *temp,*result,*temp0,*temp1;
	int i,j; //j为存放长整数的双向循环链表的元素结点计数器
	int off; //off记录同号长整数加法溢出进位值
	char ch;
	do 
	{
		off=0; //溢出进位值清0
		printf("请您按万进制格式输入两个任意长整数:");
		for (i=0;i<2;i++)
		{
			printf("\n请输入第%d个长整数:",i+1);
			DuLink[i]=Build_BDCL(i); //调用Build_BDCL(i)函数
		}

		//结点计数器j大于长整数的结点总数时,循环结束
		for (i=0;i<2;i++)
		{
			printf("\n你输入的第%d个长整数是:",i+1);
			temp=DuLink[i]; //temp初始存放长整数的双向循环链表的首元素结点
			j=1;  //存放长整数的双向循环链表的元素结点计数器初始值为1
			do
			{  
				//首元素结点不必对前导'0'进行处理,其它结点需要打印出不同位数的前导'0'
				if (j>1)
				{
					//当temp->data的绝对值<=999,<=99,<=9时,加入前导0
					if (abs(temp->data)<=9)
						printf("000");   
					else if (abs(temp->data)<=99)
						printf("00");    
					else if (abs(temp->data)<=999)
						printf("0");     
				}
				//当j<长整数的结点总数时,打印当前结点后加','
				if (j<NodeNum[i]) 
					printf("%d,",temp->data);
				//当j==长整数的结点总数时,即打印最后一个结点时,其后不加','
				else
					printf("%d",temp->data);
				temp=temp->next;  //结点指针后移
				j++;  //结点计数器加1
			}while (j<=NodeNum[i]); 
		}

	printf("\n加法运算的结果是:");

    //如果两个长整数同号相加
	if (DuLink[0]->data*DuLink[1]->data>=0)
	{
		//同号相加,如果长整数的首元素均为负,打印负号'-'
		if (DuLink[0]->data<0)
			printf("-");

		//双向循环链表的首元素结点前驱即为末元素结点,从长整数的最低四位数计算
		temp0=DuLink[0]->prior; 
		temp1=DuLink[1]->prior; 
		
		//同号相加,如果第一个长整数的结点总数较大或两个长整数的结点总数相等
		if (NodeNum[0]>=NodeNum[1])
		{
            for (i=0;i<NodeNum[1];i++)
			{
			   temp0->data=abs(temp0->data)+abs(temp1->data)+off;
			   off=0;
               if (temp0->data>9999) //溢出,进位
			   {
				off=1; 
				temp0->data=temp0->data-10000; 
			   }
			   //指针回溯,继续高一位结点的加法运算
		       temp0=temp0->prior; 
	    	   temp1=temp1->prior;
			} 
			for (i=NodeNum[1];i<NodeNum[0];i++)
			{
				temp0->data=abs(temp0->data)+off;
				off=0;
				if (temp0->data>9999)
				{
					off=1;
					temp0->data=temp0->data-10000;
				}
		        temp0=temp0->prior;
			}
			if (off)
				printf("1,");
			result=DuLink[0];//;temp0->next               
		}

		//同号相加,如果第二个长整数的结点总数较大
		else
		{
            for (i=0;i<NodeNum[0];i++)
			{
			   temp1->data=abs(temp0->data)+abs(temp1->data)+off;
			   off=0;
               if (temp1->data>9999)
			   {
					off=1;
					temp1->data=temp1->data-10000;
			   }
			   //指针回溯到高一位结点,继续高一位结点的加法运算
		       temp0=temp0->prior;
	    	   temp1=temp1->prior;
			} 
			for (i=NodeNum[0];i<NodeNum[1];i++)
			{
				temp1->data=abs(temp1->data)+off;
				off=0;
				if (temp1->data>9999)
				{
					off=1;
					temp1->data=temp1->data-10000;
				}
		        temp1=temp1->prior;
			}
			if (off)
				printf("1,");
			result=DuLink[1];//temp1->next;
		}
	}

	//如果两个长整数异号相加
	else
	{
		//异号相加,如果两个长整数的结点总数相等
		if (NodeNum[0]==NodeNum[1])
		{   
			//先判断两个长整数异号相加后的正负符号,并将其打印出来
		    temp0=DuLink[0]; //temp0指向存放第一个长整数的双向循环链表的首元素结点
		    temp1=DuLink[1]; //temp1指向存放第二个长整数的双向循环链表的首元素结点
			for (i=0;i<NodeNum[0];i++)
			{
				//异号相加,两个长整数的结点总数相等,从最高4位起检查,如果存在某个结点数据的绝对值不相等
				if (abs(temp0->data)!=abs(temp1->data)) 
				{
				  //如果第一个长整数的当前结点数据的绝对值大
				  if (abs(temp0->data)>abs(temp1->data)) 
				  {
			    	 if (DuLink[0]->data<0)
				        printf("-");
				  }
				  //如果第二个长整数当前结点数据的绝对值大,互换两个长整数
				  else 
				  {
					  if (DuLink[1]->data<0)
						printf("-");
					  temp=DuLink[0];
					  DuLink[0]=DuLink[1];
					  DuLink[1]=temp;
				  }
				  //i=NodeNum[0]+10; 
				  //第一个长整数的结点总数+10?不明白?奇怪注释掉或保留都不影响正确运行???
				}
				//异号相加,两长整数结点总数相等,如当前结点数据绝对值相等,指针后移,比较下一个结点
				else 
				{
				  temp0=temp0->next;
				  temp1=temp1->next;
				}
			}

			//双向循环链表的首元素结点前驱即为末元素结点,从长整数的最低四位数计算
			temp0=DuLink[0]->prior; 
			temp1=DuLink[1]->prior;

			//两个长整数异号相加后的正负符号问题已解决,首元素结点数据取绝对值
			DuLink[0]->data=abs(DuLink[0]->data);
            DuLink[1]->data=abs(DuLink[1]->data);

            for (i=0;i<NodeNum[0];i++) 
			{
				//借位处理,如当前结点数据原为0000,被低一位借位后为-1,需继续向高一位结点借位
				if (temp0->data==-1) 
				{
					temp0->data=9999-temp1->data; 
					temp0->prior->data=temp0->prior->data-1; //高一位结点数据减1
				}
				//借位处理
				else if (temp0->data-temp1->data<0)
				{
					temp0->data=10000+temp0->data-temp1->data;
					temp0->prior->data=temp0->prior->data-1; //高一位结点数据减1
				}
				else
					temp0->data=temp0->data-temp1->data;
			   //指针回溯,继续高一位结点的加法运算
		       temp0=temp0->prior;
	    	   temp1=temp1->prior;
			}
			result=DuLink[0];//temp0->next;
		}

		//异号相加,如果第一个长整数的结点总数较大
		else if (NodeNum[0]>NodeNum[1])
		{
		 	temp0=DuLink[0]->prior;
	    	temp1=DuLink[1]->prior;
            if (DuLink[0]->data<0)
			{
				printf("-");
				DuLink[0]->data=abs(DuLink[0]->data);
			}
			else
				DuLink[1]->data=abs(DuLink[1]->data);
			for (i=0;i<NodeNum[1];i++)
			{
				if (temp0->data==-1)
				{
					temp0->data=9999-temp1->data;
					temp0->prior->data=temp0->prior->data-1;
				}
				else if (temp0->data-temp1->data<0)
				{
					temp0->data=10000+temp0->data-temp1->data;
					temp0->prior->data=temp0->prior->data-1;
				}
				else
					temp0->data=temp0->data-temp1->data;
				temp0=temp0->prior;
				temp1=temp1->prior;
			} 
			for (i=NodeNum[1];i<NodeNum[0];i++)
			{
				if (temp0->data==-1)
				{
					temp0->data=9999;
					temp0->prior->data=temp0->prior->data-1;
				}   
				temp0=temp0->prior;			   
			}
			result=DuLink[0]; //temp0->next;
		}

		//异号相加,如果第二个长整数的结点总数较大
		else
		{
			temp0=DuLink[0]->prior;
	    	temp1=DuLink[1]->prior;

            if (DuLink[1]->data<0)
			{
				printf("-");
				DuLink[1]->data=abs(DuLink[1]->data);
			}
			else
				DuLink[0]->data=abs(DuLink[0]->data);
			for (i=0;i<NodeNum[0];i++)
			{
				if (temp1->data==-1)
				{
					temp1->data=9999-temp0->data;
					temp1->prior->data=temp1->prior->data-1;
				}
				else if (temp1->data-temp0->data<0)
				{
					temp1->data=10000+temp1->data-temp0->data;
					temp1->prior->data=temp1->prior->data-1;
				}
				else
					temp1->data=temp1->data-temp0->data;
			temp0=temp0->prior;
			temp1=temp1->prior;
			} 
			for (i=NodeNum[0];i<NodeNum[1];i++)
			{
               if (temp1->data==-1)
			   {
                  temp1->data=9999;
				  temp1->prior->data=temp1->prior->data-1;
			   }    
			   temp1=temp1->prior;
			}
			result=DuLink[1]; //temp0->next;
		}
	}
	
	//继续输出结果
	//(运算结果的正负符号以及同号加运算的最高位溢出进位得到的'1'已经打印)
	temp=result;  
	j=0;  //双向循环链表的结点计数器j初值清0
	
	do 
	{
	//temp后移到再次等于result,即回到第一个结点的位置时,do循环结束
		if (off) //如果加法运算中进行过最高位结点溢出处理
			j=1;
      	if (j)
		{
             if (abs(temp->data)<0)
				printf("0000");
	         else if (abs(temp->data)<=9)
				printf("000");
	         else if (abs(temp->data)<=99)
				printf("00");
	         else if (abs(temp->data)<=999)
				printf("0");
		}
	    if (temp->data>0) 
		   j=1;
	    if (temp->next==result) //输入到最后一个结点
	       printf("%d",temp->data);
	    else
		{
		   if (j)
    	       printf("%d,",temp->data);
		}
		temp=temp->next;
	}while (temp!=result);

		free(DuLink[0]);
		NodeNum[0]=0;
		free(DuLink[1]);
		NodeNum[1]=0;

	printf("\n\n还要进行长整数加法计算吗?(Y or y):");
	ch=getche();
	printf("\n");
	}while ((ch=='Y')||(ch=='y'));
}


//该函数用来形成双向循环链表,用以存放万进制格式的长整数
struct DuLNode *Build_BDCL(int k)
{
    struct DuLNode *p=NULL,*q,*head;
    int i=0;
	char str[6]="",ch;
    do
    { 
	   ch=getche();
	   if ((ch==',') || (ch=='\r')) //如果输入的是","或"回车"
	   {
		   NodeNum[k]++;  //结点计数器加1
    	   *(str+i)=NULL; //赋空值
           q=(struct DuLNode*) malloc(sizeof(struct DuLNode));
           q->data=atoi(str); //给结点赋值
           if (p==NULL)
		   {
             p=q->prior=q->next=q;
			 head=p;
		   }
           else
		   {  //后向插入新结点
              p->next->prior=q;
              q->prior=p ;
              q->next=p->next;
              p->next=q;
              p=q;
		   }
           i=0;
		   *str='\0';
       }
	   else
       {  
		   *(str+i)=ch;
		   i++;
       }
	} while (ch!='\r');  //以输入回车符结束一个长整数的输入
	head->prior=q;
	q->next=head;
    return head;   
}//Build_BDCL

⌨️ 快捷键说明

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