大数加法,大数乘法

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

typedef struct NODE
{
	struct NODE * pUp;//前驱
	int shuzhi;//数据
	struct NODE * pNext;//后继
}*pNode;

/*******************函数声明**********************/
int multiply (char * strMultiplierA, char *  strMultiplierB, char * strRst);
pNode InitList(char * strMultiplier);
void multiplyA(pNode pHead1, pNode pFlag, int shuzhi );
void DsXj(pNode pHeadTemp, pNode pHeadstrRst);
void DsXj2(pNode pHeadTemp, pNode pHeadstrRst,char* strRst);
pNode creatList(pNode pHead);
int menu();
void DSCF();

/*主菜单*/
int menu()
{
	int choice;
	system("cls");
	printf("1:大数加法\n");
	printf("2:大数乘法\n");
	printf("0:退出\n");
	printf("请输入选项:");
	scanf("%d",&choice);
	return choice;//返回用户选择
}

//大数乘法
void DSCF()
{
	char str[1000];
	char strMultiplierA[100];
	char strMultiplierB[100];
	char strRst[20]="\0";
	int cur,flag=0;
	pNode pHead1,pHead2;
	char ch;
	system("cls");//清除屏幕
	scanf("%s",str);//获取表达式
	for(cur=0;str[cur]!='\0';cur++)//遍历表达式
	{
		if(str[cur]=='*' || str[cur]=='+')//找到+或者*
		{
			ch=str[cur];//记录该运算是+还是*
			strcpy(strMultiplierB,&str[cur+1]);//后半部分给操作数B
			str[cur]='\0';//截断前后两部分
			strcpy(strMultiplierA,str);//前半部分给操作数A
			flag=1;//标记AB分配完成
			break;
		}
	}
	if(flag==0)//如果AB分配失败 返回
	{
		return ;
	}
	switch(ch)//根据操作符 进入相应运算
	{
	case '*':
		multiply (strMultiplierA,strMultiplierB,strRst);
		printf("=");
		puts(strRst);//输出结果
		break;
	case '+':
		pHead1 = InitList(strMultiplierA);
		pHead2 = InitList(strMultiplierB);
		DsXj2(pHead1,pHead2,strRst);
		printf("=");
		puts(strRst);
		break;
	}
	printf("\n");
	system("pause");
}

int main()
{
	int choice;
	do
	{
		choice=menu();//获取用户选择
		switch(choice)//根据选择进入菜单
		{
		case 1:
		case 2:
			DSCF();
			break;
		}
	}while(choice!=0);//选择0则退出程序
	return 0;
}

//参数分别是操作数A 操作数B  答案
int multiply (char * strMultiplierA, char *  strMultiplierB, char * strRst) 
{
	pNode pHead1,pHead2,pHeadTemp,pHeadstrRst;
	pNode p1,p2,TempNode,pFlag;
	char * pCh;
	if(strMultiplierA == NULL || strMultiplierB == NULL || strRst == NULL)
		return -1;
	pHead1 = InitList(strMultiplierA);//初始化链表
	pHead2 = InitList(strMultiplierB);
	//创建链表pHeadTemp,保存单次pHead1与p2->shuzhi的乘积,pHeadTemp要比pHead1多一个节点
	pHeadTemp = creatList(pHead1);
	//创建链表pHeadstrRst,保存最终结果,pHeadstrRst要比pHeadTemp多一个节点
	pHeadstrRst = creatList(pHeadTemp);
	p2 = pHead2->pNext;
	pFlag = pHeadTemp->pNext;
	while(p2 != NULL)
	{
		//pHead1链表与p2->shuzhi的乘积
		multiplyA(pHead1, pFlag, p2->shuzhi );
		//大数求和:pHeadTemp与pHeadstrRst求和
		DsXj(pHeadTemp, pHeadstrRst);
		//p2 = p2->pNext;则多一个10n,要补零
		//须注意pHeadTemp每次都要插入一个节点,插入在第一个点,补0,因为10n
		TempNode = (pNode)malloc(sizeof(NODE));
		TempNode->shuzhi = 0;
		TempNode->pNext = pHeadTemp->pNext;
		TempNode->pUp = pHeadTemp;
		pHeadTemp->pNext = TempNode;	
		//相应的pHeadstrRst也要增加一个节点,接在最后面,用于大数相加
		p1 = pHeadstrRst;
		while(p1->pNext!=NULL)
		{
			p1 = p1->pNext;
		}
		TempNode = (pNode)malloc(sizeof(NODE));
		TempNode->shuzhi = 0;
		TempNode->pNext = NULL;
		TempNode->pUp = p1;
		p1->pNext = TempNode;
		p2 = p2->pNext;	
	}
	//使p1指向最后一个节点
	p1 = pHeadstrRst;
	while(p1->pNext!=NULL)
	{
		p1 = p1->pNext;
	}
	//使p1指向最后一个非0节点
	while((p1->shuzhi == 0) && (p1 != pHeadstrRst->pNext))
	{
		p1 = p1->pUp;
	}

	//赋值给strRst
	pCh = strRst;
	while(p1 != pHeadstrRst)
	{
		*pCh = p1->shuzhi + '0';
		pCh++;
		p1 = p1->pUp;
	}
	*pCh = '\0';
	pCh = strRst;
    return 0;
}

//根据字符串 创建双向链表
pNode InitList(char * strMultiplier) 
{
	char * pCh;
	pNode p,TempNode;
	pNode pHead;
	if(strMultiplier == NULL)
		return NULL;
	
	pCh = strMultiplier;
	while(*pCh!='\0')
	{
		pCh++;
	}

	pCh--;


	//头指针不使用,只用来作为链表头
	pHead = (pNode)malloc(sizeof(NODE));
	pHead->shuzhi = 0;
	pHead->pNext = NULL;
	pHead->pUp = NULL;
	p = pHead;
	while(pCh>=strMultiplier)
	{
		TempNode = (pNode)malloc(sizeof(NODE));
		TempNode->shuzhi = *pCh - '0';
		TempNode->pNext = NULL;
		TempNode->pUp = p;
		p->pNext = TempNode;
		p = p->pNext;
		pCh--;
	}	
    return pHead;
}

 

//pHead1链表与shuzhi的乘积
void multiplyA(pNode pHead, pNode pFlag, int shuzhi )
{
	pNode p, pTemp;
	int carry,temp;
	p = pHead->pNext;
	pTemp = pFlag;
	carry = 0;
	//pHead1链表乘以p2,并保存在pFlag
	while(p != NULL)
	{
		temp = (p->shuzhi) * shuzhi + carry;
		pTemp->shuzhi = temp % 10;
		carry = temp / 10;
		pTemp = pTemp->pNext;
		p = p->pNext;
	}
	pTemp->shuzhi = carry;
}
 
//大数求和:pHeadTemp与pHeadstrRst求和
void DsXj(pNode pHeadTemp, pNode pHeadstrRst)
{
	int carry,temp;
	pNode p1, p2, TempNode;
	p1 = pHeadTemp->pNext;
	p2 = pHeadstrRst->pNext;//保存结果
	carry = 0;
	while(p1!=NULL)
	{
		temp = p2->shuzhi + p1->shuzhi + carry;
		p2->shuzhi = temp%10;
		carry =  temp/10;
		p2 = p2->pNext;
		p1 = p1->pNext;
	}

	while(carry != 0)
	{
		p2->shuzhi = (p2->shuzhi + carry)%10;
		carry =  (p2->shuzhi + carry)/10;
		//若carry!=0,且到了最后一个节点了,就增加一个新节点
		if(carry != 0 && p2->pNext == NULL)
		{
			TempNode = (pNode)malloc(sizeof(NODE));
			TempNode->shuzhi = 0;
			TempNode->pNext = NULL;
			TempNode->pUp = p2;
			p2->pNext = TempNode;
		}
		p2 = p2->pNext;	
	}
}

//大数求和:pHeadTemp与pHeadstrRst求和
void DsXj2(pNode pHeadTemp, pNode pHeadstrRst,char* strRst)
{
	int carry,temp;
	pNode p1, p2, TempNode;
	p1 = pHeadTemp->pNext;
	p2 = pHeadstrRst->pNext;//保存结果
	carry = 0;
	while(p1!=NULL)
	{
		temp = p2->shuzhi + p1->shuzhi + carry;
		p2->shuzhi = temp%10;
		carry =  temp/10;
		if(p2->pNext==NULL)
		{
			p2->pNext=(pNode)malloc(sizeof(NODE));
			p2->pNext->pNext=NULL;
			p2->pNext->pUp=p2;
			p2->pNext->shuzhi=0;
		}
		p2 = p2->pNext;
		p1 = p1->pNext;
	}

	while(carry != 0)
	{
		p2->shuzhi = (p2->shuzhi + carry)%10;
		carry =  (p2->shuzhi + carry)/10;
		//若carry!=0,且到了最后一个节点了,就增加一个新节点
		if(carry != 0 && p2->pNext == NULL)
		{
			TempNode = (pNode)malloc(sizeof(NODE));
			TempNode->shuzhi = 0;
			TempNode->pNext = NULL;
			TempNode->pUp = p2;
			p2->pNext = TempNode;
		}
		p2 = p2->pNext;	
	}

	//使p1指向最后一个节点
	p1 = pHeadstrRst;
	while(p1->pNext!=NULL)
	{
		p1 = p1->pNext;
	}
	//使p1指向最后一个非0节点
	while((p1->shuzhi == 0) && (p1 != pHeadstrRst->pNext))
	{
		p1 = p1->pUp;
	}

	//赋值给strRst
	char* pCh = strRst;
	while(p1 != pHeadstrRst)
	{
		*pCh = p1->shuzhi + '0';
		pCh++;
		p1 = p1->pUp;
	}
	*pCh = '\0';
	pCh = strRst;
}

//根据pHead创建链表
pNode creatList(pNode pHead)
{
	pNode pTemp,p,TempNode,pHeadTemp;
	pHeadTemp = (pNode)malloc(sizeof(NODE));
	pHeadTemp->shuzhi = 0;
	pHeadTemp->pNext = NULL;
	pHeadTemp->pUp = NULL;
	pTemp = pHeadTemp;
	p = pHead;//使pHeadTemp、pHeadstrRst比pHead1多一个节点
	while(p != NULL)
	{
		//pHeadTemp
		TempNode = (pNode)malloc(sizeof(NODE));
		TempNode->shuzhi = 0;
		TempNode->pNext = NULL;
		TempNode->pUp = pTemp;
		pTemp->pNext = TempNode;	
		pTemp = pTemp->pNext;
		p = p->pNext;
	}
	return pHeadTemp;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值