#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstdlib>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;
//addNodePre and addNodeNex structure
struct Node
{
int num;
Node *pNode;
Node *nNode;
};
//result structure
struct Result
{
int num = 0;
int carry = 0;
Result *pNode;
Result *nNode;
};
Result* getLastNode(Result* head) //找到结果链表的尾部节点。传入链表头指针
{
Result* wp;
wp = head;
while (wp->nNode != NULL)
{
wp = wp->nNode;
}
return wp;
}
Node* getLastNode(Node* head) //找到加数链表的尾部节点。传入链表头指针
{
Node* wp;
wp = head;
while (wp->nNode != NULL)
{
wp = wp->nNode;
}
return wp;
}
Node* insertNodeNum(int num, Node* head) //在加数链表尾部添加一个节点,节点num为加数
{
Node *wp, *node;
if (!(node = new Node))
{
cout << "allocate failed!";
return NULL;
}
else{
node->num = num;
node->nNode = NULL;
if (head == NULL)
{
head = node;
return head;
}
wp = head;
while (wp->nNode != NULL)
{
wp = wp->nNode;
}
wp->nNode = node;
node->pNode = wp;
return head;
}
}
Result* insertResultNum(int num, Result* head) //在结果链表尾部添加一个节点,节点num为结果数
{
Result *wp, *node;
if (!(node = new Result))
{
cout << "allocate failed!";
return NULL;
}
else{
node->num = num;
node->nNode = NULL;
if (head == NULL)
{
head = node;
return head;
}
wp = head;
while (wp->nNode != NULL)
{
wp = wp->nNode;
}
wp->nNode = node;
node->pNode = wp;
return head;
}
}
Result* addNodeNum(Node* addNodePre, Node* addNodeNex, Result* result) //加法
{
Node* lastNodePre = getLastNode(addNodePre);// 加数
Node* lastNodeNex = getLastNode(addNodeNex);// 被加数
Result* resultNode = getLastNode(result);// 结果
//下面计算加数长度的结果
while (lastNodeNex != addNodeNex) // 若加数链表头与链表尾部节点不相等,也就是加数链表中还有数据。
{
resultNode->num = lastNodePre->num + lastNodeNex->num + resultNode->carry;// 加数 被加数 和进位相加
if (resultNode->num > 9)//结果若有进位
{
resultNode->num = resultNode->num % 10;
resultNode->pNode->carry = 1;
}
lastNodePre = lastNodePre->pNode;//前移一位
lastNodeNex = lastNodeNex->pNode;//前移一位
resultNode = resultNode->pNode;//前移一位
}
resultNode->num = addNodeNex->num + lastNodePre->num + resultNode->carry; // 加数 被加数 和进位相加
if (resultNode->num > 9)//结果若有进位
{
resultNode->num = resultNode->num % 10;
resultNode->pNode->carry = 1;
}
//下面算出被加数长度的结果
while (lastNodePre != addNodePre)// 若被加数链表头与链表尾部节点不相等,也就是被加数链表中还有数据。
{
lastNodePre = lastNodePre->pNode;//前移一位
resultNode = resultNode->pNode;//前移一位
resultNode->num = lastNodePre->num + resultNode->carry;//将进位与被加数相加
if (resultNode->num > 9)
{
resultNode->num = resultNode->num % 10;
resultNode->pNode->carry = 1;
}
}
resultNode = resultNode->pNode;//结果前移一位
resultNode->num = resultNode->carry;
return result;
}
Result* subNodeNum(Node* addNodePre, Node* addNodeNex, Result* result)//减法函数
{
Node* lastNodePre = getLastNode(addNodePre);
Node* lastNodeNex = getLastNode(addNodeNex);
Result* resultNode = getLastNode(result);
while (lastNodeNex != addNodeNex)
{
resultNode->num = lastNodePre->num - lastNodeNex->num + resultNode->carry;
if (resultNode->num < 0) //若是有借位
{
resultNode->num += 10;
resultNode->pNode->carry -= 1;
}
lastNodePre = lastNodePre->pNode;
lastNodeNex = lastNodeNex->pNode;
resultNode = resultNode->pNode;
}
resultNode->num = lastNodePre->num - addNodeNex->num + resultNode->carry;
if (resultNode->num < 0)
{
resultNode->num += 10;
resultNode->pNode->carry -= 1;
}
while (lastNodePre != addNodePre)
{
lastNodePre = lastNodePre->pNode;
resultNode = resultNode->pNode;
resultNode->num = lastNodePre->num + resultNode->carry;
if (resultNode->num < 0)
{
resultNode->num += 10;
resultNode->pNode->carry -= 1;
}
}
return result;
}
void resultNodeDis(Result* head)
{
int srcPreLen[100];
int i = 0;
int flag = 0;
Result* temp;
Result* lastNode;
Result* wp;
memset(srcPreLen, 0, 100);
lastNode = getLastNode(head);
temp = head;
while (temp)
{
if (temp->num == -1 || temp->num == 0)
{
if (temp == lastNode)
{
cout << "0";
}
}
if (temp->num != -1 && temp->num != 0)
{
break;
}
temp = temp->nNode;
}
wp = head;
while (wp)
{
if (wp->num != -1 && wp->num != 0 || flag == 1)
{
srcPreLen[i++] = wp->num;
flag = 1;
}
wp = wp->nNode;
}
if (i > 4)
{
int k, w = i % 4;
for (k = 0; k < w; k++)
{
cout << srcPreLen[k];
}
if (w != 0)
{
cout << ",";
}
for (; k < i; k++)
{
for (int d = 0; d < 4; d++)
{
cout << srcPreLen[k];
k++;
}
k--;
if (k != i - 1)
{
cout << ",";
}
}
}else
{
for (int g = 0; g < i; g++)
{
//cout << "输出结果为:";
cout << srcPreLen[g];
}
}
}
int getInputStringLen(string s) // 计算所输入字符串长度
{
int cnt = 0;
for (auto c : s)
{
if (isdigit(c))
{
++cnt;
}
}
return cnt;
}
void moveToDest(string src, char* &dest, int n) // 将源字符串分拆为字符串填入dest中
{
int k = 1;
if (isdigit(src[0]))
{
dest[0] = '1';
}
else
{
dest[0] = '0';
}
for (int i = 0; k < n, i < src.length(); i++)
{
if (isdigit(src[i]))
{
dest[k] = src[i];
k++;
}
}
}
int compareNeighborNode(string srcPrev, string srcNex) // 比较相邻两个字符串数据的大小
{
int srcPreLen = getInputStringLen(srcPrev) + 1;
int srcNexLen = getInputStringLen(srcNex) + 1;
if (srcPreLen > srcNexLen)
{
return 1;
}
if (srcPreLen < srcNexLen)
{
return 0;
}
char* destPrev = new char[srcPreLen];
char* destNex = new char[srcNexLen];
memset(destPrev, 0, srcPreLen);
memset(destNex, 0, srcNexLen);
moveToDest(srcPrev, destPrev, srcPreLen);
moveToDest(srcNex, destNex, srcNexLen);
for (int i = 1; i < srcPreLen; i++)
{
if (destPrev[i] > destNex[i])
{
return 1;
}
if (destPrev[i] < destNex[i])
{
return 0;
}
}
return 1;
}
Node* chToIntAndInsert(Node* head, char* num, int n) // 将字符串转换为整数并插入到节点链表中
{
for (int i = 1; i <= n - 1; i++)
{
int sum = num[i] - '0';
head = insertNodeNum(sum, head);
}
return head;
}
int main(int argc, _TCHAR* argv[])
{
//cout << endl;
//cout << "请输入第一个数:";
Node* addNodePre = NULL;
Node* addNodeNex = NULL;
Result* result = NULL;
string srcPrev, srcNex;
char i;
int srcPreLen = 0;
int srcNexLen = 0;
char* destPrev = NULL;
char* destNex = NULL;
cout << "所输入字符串最大长度不能超过";
cout << srcPrev.max_size();
cout << endl;
cout << "按任意非q键继续,按q键退出!";
cout << endl;
while (_getch() != 'q')
{
addNodePre = NULL;
addNodeNex = NULL;
result = NULL;
srcPreLen = 0;
srcNexLen = 0;
destPrev = NULL;
destNex = NULL;
i = '0';
cout << "请输入第一个数:";
cin >> srcPrev;
for (auto c1 : srcPrev)
{
if (!isdigit(c1))
{
cout << "输入的非数字字符,请重新输入第一个数:";
cin >> srcPrev;
}
}
cout << "请输入第二个数:";
cin >> srcNex;
for (auto c2 : srcNex)
{
if (!isdigit(c2))
{
cout << "输入的非数字字符,请重新输入第二个数:";
cin >> srcNex;
}
}
cout << "最终输出结果为:";
srcPreLen = getInputStringLen(srcPrev) + 1; //获取输入数据字符串的长度
srcNexLen = getInputStringLen(srcNex) + 1; //获取输入数据字符串的长度
destPrev = new char[srcPreLen];
destNex = new char[srcNexLen];
memset(destPrev, 0, srcPreLen);
memset(destNex, 0, srcNexLen);
moveToDest(srcPrev, destPrev, srcPreLen);
moveToDest(srcNex, destNex, srcNexLen);
addNodePre = chToIntAndInsert(addNodePre, destPrev, srcPreLen);
addNodeNex = chToIntAndInsert(addNodeNex, destNex, srcNexLen);
int q = srcPreLen > srcNexLen ? srcPreLen + 1 : srcNexLen + 1; //获取两个数长度较长的那个量
for (int j = 1; j < q; j++)
{
result = insertResultNum(-1, result);
}
if (compareNeighborNode(srcPrev, srcNex))
{
if (destPrev[0] == '0' && destNex[0] == '0')
{
addNodeNum(addNodePre, addNodeNex, result);
cout << "-";
resultNodeDis(result);
}
if (destPrev[0] == '1' && destNex[0] == '0')
{
subNodeNum(addNodePre, addNodeNex, result);
resultNodeDis(result);
}
if (destPrev[0] == '0'&& destNex[0] == '1')
{
subNodeNum(addNodePre, addNodeNex, result);
cout << "-";
resultNodeDis(result);
}
if (destPrev[0] == '1' && destNex[0] == '1')
{
addNodeNum(addNodePre, addNodeNex, result);
resultNodeDis(result);
}
}
else
{
if (destPrev[0] == '0' && destNex[0] == '0')
{
addNodeNum(addNodeNex, addNodePre, result);
cout << "-";
resultNodeDis(result);
}
if (destPrev[0] == '1' && destNex[0] == '0')
{
subNodeNum(addNodeNex, addNodePre, result);
cout << "-";
resultNodeDis(result);
}
if (destPrev[0] == '0' && destNex[0] == '1')
{
subNodeNum(addNodeNex, addNodePre, result);
resultNodeDis(result);
}
if (destPrev[0] == '1' && destNex[0] == '1')
{
addNodeNum(addNodeNex, addNodePre, result);
resultNodeDis(result);
}
}
cout << endl;
_getch();
//cout << "按下q键退出!";
}
return 0;
}
结果:
数字字符太长会崩溃?需优化。