问题抽还 设计一个程序实现两个任意长的整数求和运算。 基本要求 利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的范围是 -(21*-1)~(21*-1)。 输入和输出形式:每4位- -组, 组间用逗号隔开。 测试数据 (1)0和0,应输出“0”。 (2) -2345,6789,-7654,3211, 应输出“-10000,0000”。 (3) 9999.9999,,000000000, 应输出9999,000,0001”。 录 (4) 1,001,000,-1,001,0001, 应输出“0”。 (5) 1,00,0001, -1 ,00,0000,应输出“1”。 实现提示 (1)每个结点中可以存放的最大整数为219-1=32767,这样才能保证两数相加不会溢出。但若按 32 768进制数存放,在+进制数与32768进制数之间的转换十分不方便,故可以在每个结点中仅存放十 进制数的4位,即不超过9 999的非负整数,整个链表视为万进制数。 (2)可以利用头结点数据域的符号代表长整数的符号。用其绝对值表示元素结点数目。相加过程 中不要破坏两个操作数链表。两操作数的头指针存于指针数组中是简化程序结构的一一种方法。 不能给 长整数位数规定上限。

时间: 2023-06-14 08:04:33 浏览: 85
以下是一个基于双向循环链表实现长整数求和的示例程序。程序的实现思路如下: 1. 定义一个双向循环链表结构体,每个节点存储4位十进制数,头结点的符号位表示长整数的符号,链表长度存储在头结点的绝对值中。 2. 读入两个长整数,并将它们存储到两个双向循环链表中。 3. 将两个链表从低位到高位逐位相加,将结果存储到一个新的链表中。 4. 对于新链表中每个节点的值,如果大于等于10000,则需要向高位进位,并将当前节点的值减去10000;如果小于0,则需要向高位借位,并将当前节点的值加上10000。 5. 最后输出新链表表示的长整数。 ```C++ #include <iostream> #include <string> using namespace std; const int BASE = 10000; // 每个节点存储的数值的最大值 const int DIGITS = 4; // 每个节点存储的数值的位数 // 定义双向循环链表节点结构体 struct ListNode { int val; // 当前节点存储的数值 ListNode* prev; // 前驱指针 ListNode* next; // 后继指针 ListNode(int x = 0) : val(x), prev(nullptr), next(nullptr) {} }; // 定义双向循环链表结构体 struct LinkedList { ListNode* head; // 头结点 LinkedList() : head(new ListNode()) { head->prev = head->next = head; } ~LinkedList() { // 销毁链表 ListNode* cur = head->next; while (cur != head) { ListNode* next = cur->next; delete cur; cur = next; } delete head; } void insert(int x) { // 在链表末尾插入一个节点 ListNode* node = new ListNode(x); node->prev = head->prev; node->next = head; head->prev->next = node; head->prev = node; ++(head->val); // 链表长度加1 } void print() { // 输出链表表示的长整数 if (head->val == 0) { // 长整数为0 cout << "0" << endl; return; } if (head->val < 0) { // 长整数为负数 cout << "-"; } ListNode* cur = head->prev; while (cur != head) { cout.width(DIGITS); cout.fill('0'); cout << abs(cur->val); cur = cur->prev; if (cur != head) { cout << ","; } } cout << endl; } }; // 将一个字符串转换为长整数的双向循环链表表示 LinkedList stringToList(const string& s) { LinkedList list; int sign = 1; int start = 0; if (s[0] == '-') { // 字符串表示的长整数为负数 sign = -1; start = 1; } int num = 0; int len = 0; for (int i = s.length() - 1; i >= start; --i) { num += (s[i] - '0') * pow(10, len++); if (len == DIGITS || i == start) { // 每4位一组,转换为一个节点存储 list.insert(sign * num); num = 0; len = 0; } } return list; } // 两个双向循环链表相加 LinkedList add(const LinkedList& a, const LinkedList& b) { LinkedList sum; ListNode* curA = a.head->next; ListNode* curB = b.head->next; int carry = 0; // 进位 while (curA != a.head || curB != b.head) { int valA = curA != a.head ? curA->val : 0; int valB = curB != b.head ? curB->val : 0; int val = valA + valB + carry; sum.insert(val % BASE); carry = val / BASE; if (curA != a.head) { curA = curA->next; } if (curB != b.head) { curB = curB->next; } } if (carry != 0) { // 如果最高位有进位 sum.insert(carry); } return sum; } // 对链表表示的长整数求相反数 LinkedList negate(const LinkedList& list) { LinkedList neg; neg.head->val = -list.head->val; ListNode* cur = list.head->next; while (cur != list.head) { neg.insert(-cur->val); cur = cur->next; } return neg; } // 比较两个链表表示的长整数的大小(绝对值) int compare(const LinkedList& a, const LinkedList& b) { if (a.head->val != b.head->val) { return a.head->val > b.head->val ? 1 : -1; } ListNode* curA = a.head->prev; ListNode* curB = b.head->prev; while (curA != a.head && curB != b.head) { if (curA->val != curB->val) { return curA->val > curB->val ? 1 : -1; } curA = curA->prev; curB = curB->prev; } return 0; } // 计算两个链表表示的长整数的差(假设a>=b) LinkedList subtract(const LinkedList& a, const LinkedList& b) { LinkedList diff; ListNode* curA = a.head->next; ListNode* curB = b.head->next; int borrow = 0; // 借位 while (curA != a.head || curB != b.head) { int valA = curA != a.head ? curA->val : 0; int valB = curB != b.head ? curB->val : 0; int val = valA - valB - borrow; if (val < 0) { borrow = 1; val += BASE; } else { borrow = 0; } diff.insert(val); if (curA != a.head) { curA = curA->next; } if (curB != b.head) { curB = curB->next; } } while (diff.head->prev != diff.head && diff.head->prev->val == 0) { // 去掉高位的0 ListNode* node = diff.head->prev; node->prev->next = diff.head; diff.head->prev = node->prev; delete node; --(diff.head->val); } return diff; } int main() { string s1, s2; cin >> s1 >> s2; LinkedList a = stringToList(s1); LinkedList b = stringToList(s2); LinkedList sum; if (a.head->val >= 0 && b.head->val >= 0) { // 两个长整数都为非负数 sum = add(a, b); } else if (a.head->val < 0 && b.head->val < 0) { // 两个长整数都为负数 sum = add(negate(a), negate(b)); sum.head->val = -sum.head->val; } else { // 两个长整数符号不同 if (compare(a, b) >= 0) { // |a| >= |b| sum = subtract(a, b); } else { sum = subtract(b, a); sum.head->val = -sum.head->val; } } sum.print(); return 0; } ```

最新推荐

recommend-type

C++双向链表实现简单通讯录

主要为大家详细介绍了C++双向链表实现简单通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

数据结构实验报告之一元多项式求和(链表)报告2.doc

实验内容:一元多项式求和。 把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果...一元多项式求和——把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。
recommend-type

对python实现合并两个排序链表的方法详解

今天小编就为大家分享一篇对python实现合并两个排序链表的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

两个n位大整数的四则运算数据结构课程设计报告

请设计一个有效的算法,可以进行两个n位大整数的四则运算。 要求: 1.设计数据结构,存储结构; 2.在c兼容环境完成上述题目的代码编写与调试; 3.程序运行界面交互性好; 4.软件运行,给出测试数据。
recommend-type

基于C/C++开发的单目控制机械臂的上位机程序+视觉识别和关节角反解+源码(高分优秀项目)

基于C/C++开发的单目控制机械臂的上位机程序+视觉识别和关节角反解+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C/C++开发的单目控制机械臂的上位机程序+视觉识别和关节角反解+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C/C++开发的单目控制机械臂的上位机程序+视觉识别和关节角反解+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C/C++开发的单目控制机械臂的上位机程序+视觉识别和关节角反解+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。