#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;
}
大数加法,大数乘法
最新推荐文章于 2021-06-17 12:21:46 发布