[习题描述] 设计—个实现任意长的整数进行四则运算和幂次运算的演示程序。 [基本要求] 利用双向循环链表实现大数的存储,每个结点含一个整型变量。 [实现提示] 实现原理:任何一个数都可以表示成指数形式,如下所示: N=nEe (0=<n的绝对值<=1,e为10的指数幂) 例如100可以表示成1E2,1001可以表示成1.01E3 ,写出C语言完整代码

时间: 2024-02-14 12:08:58 浏览: 23
以下是基于双向循环链表实现任意长整数四则运算和幂次运算的演示程序的C语言完整代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> /* 定义双向循环链表结点 */ typedef struct Node { int data; struct Node *prev; struct Node *next; } Node; /* 定义大数结构体 */ typedef struct BigNum { Node *head; // 指向双向循环链表的头结点 int sign; // 1表示正数,-1表示负数 } BigNum; /* 初始化双向循环链表 */ void initList(Node **head) { *head = (Node*)malloc(sizeof(Node)); (*head)->prev = *head; (*head)->next = *head; } /* 在双向循环链表尾部插入结点 */ void append(Node *head, int data) { Node *node = (Node*)malloc(sizeof(Node)); node->data = data; node->prev = head->prev; node->next = head; head->prev->next = node; head->prev = node; } /* 删除双向循环链表中的所有结点 */ void clearList(Node *head) { Node *p = head->next; while (p != head) { Node *q = p->next; free(p); p = q; } head->prev = head; head->next = head; } /* 创建一个大数结构体 */ BigNum *createBigNum() { BigNum *num = (BigNum*)malloc(sizeof(BigNum)); num->head = NULL; num->sign = 1; return num; } /* 将字符串形式的大数转换为大数结构体 */ void parseBigNum(char *str, BigNum *num) { int len = strlen(str); int i = 0; if (str[0] == '-') { num->sign = -1; i++; } initList(&num->head); while (i < len && str[i] != '.') { append(num->head, str[i] - '0'); i++; } if (i < len) { i++; // 跳过小数点 while (i < len) { append(num->head, str[i] - '0'); i++; } } } /* 将大数结构体转换为字符串形式的大数 */ char *formatBigNum(BigNum *num) { int len = 0; Node *p = num->head->next; while (p != num->head) { len++; p = p->next; } if (len == 0) { return "0"; } char *str = (char*)malloc(len + 2); int i = 0; if (num->sign == -1) { str[i++] = '-'; } p = num->head->next; while (p != num->head) { str[i++] = p->data + '0'; p = p->next; } str[i] = '\0'; return str; } /* 比较两个大数的大小 */ int compare(BigNum *num1, BigNum *num2) { Node *p = num1->head->next; Node *q = num2->head->next; while (p != num1->head && p->data == 0) { p = p->next; } while (q != num2->head && q->data == 0) { q = q->next; } if (p == num1->head && q == num2->head) { return 0; // 两个数相等 } else if (p == num1->head && q != num2->head) { return -1; // num1 < num2 } else if (p != num1->head && q == num2->head) { return 1; // num1 > num2 } else { int len1 = 0, len2 = 0; while (p != num1->head) { len1++; p = p->next; } while (q != num2->head) { len2++; q = q->next; } if (len1 < len2) { return -1; // num1 < num2 } else if (len1 > len2) { return 1; // num1 > num2 } else { p = num1->head->next; q = num2->head->next; while (p != num1->head && q != num2->head) { if (p->data < q->data) { return -1; // num1 < num2 } else if (p->data > q->data) { return 1; // num1 > num2 } else { p = p->next; q = q->next; } } return 0; // 两个数相等 } } } /* 对两个大数取绝对值后进行比较 */ int compareAbs(BigNum *num1, BigNum *num2) { BigNum *abs1 = createBigNum(); BigNum *abs2 = createBigNum(); abs1->head = num1->head; abs2->head = num2->head; abs1->sign = 1; abs2->sign = 1; int result = compare(abs1, abs2); free(abs1); free(abs2); return result; } /* 大数加法 */ BigNum *add(BigNum *num1, BigNum *num2) { BigNum *result = createBigNum(); Node *p = num1->head->prev; Node *q = num2->head->prev; int carry = 0; // 进位 while (p != num1->head || q != num2->head) { int sum = carry; if (p != num1->head) { sum += p->data; p = p->prev; } if (q != num2->head) { sum += q->data; q = q->prev; } append(result->head, sum % 10); carry = sum / 10; } if (carry > 0) { append(result->head, carry); } // 去掉前导0 while (result->head->next != result->head && result->head->next->data == 0) { Node *temp = result->head->next; result->head->next = temp->next; temp->next->prev = result->head; free(temp); } return result; } /* 大数减法 */ BigNum *subtract(BigNum *num1, BigNum *num2) { BigNum *result = createBigNum(); if (compareAbs(num1, num2) < 0) { result->sign = -1; BigNum *temp = num1; num1 = num2; num2 = temp; } Node *p = num1->head->prev; Node *q = num2->head->prev; int borrow = 0; // 借位 while (p != num1->head || q != num2->head) { int diff = borrow; if (p != num1->head) { diff += p->data; p = p->prev; } if (q != num2->head) { diff -= q->data; q = q->prev; } if (diff < 0) { diff += 10; borrow = -1; } else { borrow = 0; } append(result->head, diff); } // 去掉前导0 while (result->head->next != result->head && result->head->next->data == 0) { Node *temp = result->head->next; result->head->next = temp->next; temp->next->prev = result->head; free(temp); } return result; } /* 大数乘法 */ BigNum *multiply(BigNum *num1, BigNum *num2) { BigNum *result = createBigNum(); Node *p = num1->head->prev; while (p != num1->head) { int carry = 0; Node *q = num2->head->prev; BigNum *temp = createBigNum(); while (q != num2->head) { int product = p->data * q->data + carry; append(temp->head, product % 10); carry = product / 10; q = q->prev; } if (carry > 0) { append(temp->head, carry); } // 在temp结尾添加len个0 int len = num1->head->prev->data - p->data; while (len > 0) { append(temp->head, 0); len--; } result = add(result, temp); free(temp); p = p->prev; } if (num1->sign != num2->sign) { result->sign = -1; } return result; } /* 大数除法 */ BigNum *divide(BigNum *num1, BigNum *num2) { BigNum *result = createBigNum(); BigNum *remain = createBigNum(); remain->head = num1->head; remain->sign = 1; while (compareAbs(remain, num2) >= 0) { BigNum *temp = createBigNum(); Node *p = remain->head->next; while (compareAbs(temp, num2) < 0 && p != remain->head) { append(temp->head, p->data); p = p->next; } int quotient = 0; while (compareAbs(temp, num2) >= 0) { temp = subtract(temp, num2); quotient++; } append(result->head, quotient); clearList(remain->head); p = temp->head->next; while (p != temp->head) { append(remain->head, p->data); p = p->next; } remain->sign = 1; free(temp); } free(remain); if (num1->sign != num2->sign) { result->sign = -1; } // 去掉前导0 while (result->head->next != result->head && result->head->next->data == 0) { Node *temp = result->head->next; result->head->next = temp->next; temp->next->prev = result->head; free(temp); } return result; } /* 大数幂次运算 */ BigNum *power(BigNum *num, int exp) { BigNum *result = createBigNum(); append(result->head, 1); while (exp > 0) { if (exp % 2 == 1) { result = multiply(result, num); } num = multiply(num, num); exp /= 2; } return result; } int main() { char str1[101], str2[101]; scanf("%s %s", str1, str2); BigNum *num1 = createBigNum(); BigNum *num2 = createBigNum(); parseBigNum(str1, num1); parseBigNum(str2, num2); BigNum *sum = add(num1, num2); BigNum *diff = subtract(num1, num2); BigNum *product = multiply(num1, num2); BigNum *quotient = divide(num1, num2); BigNum *power_num = power(num1, 3); printf("%s + %s = %s\n", str1, str2, formatBigNum(sum)); printf("%s - %s = %s\n", str1, str2, formatBigNum(diff)); printf("%s * %s = %s\n", str1, str2, formatBigNum(product)); printf("%s / %s = %s\n", str1, str2, formatBigNum(quotient)); printf("%s ^ 3 = %s\n", str1, formatBigNum(power_num)); free(num1); free(num2); free(sum); free(diff); free(product); free(quotient); free(power_num); return 0; } ``` 需要注意的是,在进行大数除法运算时,除数不能为0,需要进行错误处理。

最新推荐

recommend-type

python练习题 :用户任意输入10个整数到列表中,然后由大到小排列并输出。

一:填空题: 1.python是一种面向_对象 __的高级语言。 2.python可以在多种平台运行,这体现了python的___可移植___特性。 3.python源代码被解释器转换后的格式为___.pyc______。 4.python3.x默认使用的编码是_UTF-8...
recommend-type

MOOC《Python语言程序设计》第6周练习题

这周讲解了组合数据类型,重点介绍表达和处理一组数据的方法,涉及到多种数据类型,包括:集合类型、序列类型(含元组类型和列表类型)和字典类型;讲解2个颇有用处的实例:基本统计值计算和文本词频统计,其中,即...
recommend-type

C语言程序设计练习题(参考答案).docx

大学C语言期末考试练习题(带详解答案).doc 大一新生接触到C语言程序设计的时,难免有些困难,在学习上受阻,但在习题巩固的帮助下,能更好更快接受新知识,学好C语言。
recommend-type

Python语言程序设计基础(第二版)P93答案示例

P93程序练习题代码示例 3.1 重量计算。月球上物体的体重是在地球上的16.5%,假如你在地球上每年增长 0.5 kg,编写程序,输入未来十年你在地球和月球上的体重状况。示例: #重量计算 weight = int(input("请输入你的...
recommend-type

Python3程序设计课后习题参考答案.pdf.pdf

Python 3 程序设计课后习题答案 译作者: 唐永华 刘德山 李玲 出版社:人民邮电出版社
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

SQL怎么实现 数据透视表

SQL可以通过使用聚合函数和GROUP BY子句来实现数据透视表。 例如,假设有一个销售记录表,其中包含产品名称、销售日期、销售数量和销售额等信息。要创建一个按照产品名称、销售日期和销售额进行汇总的数据透视表,可以使用以下SQL语句: ``` SELECT ProductName, SaleDate, SUM(SaleQuantity) AS TotalQuantity, SUM(SaleAmount) AS TotalAmount FROM Sales GROUP BY ProductName, SaleDate; ``` 该语句将Sales表按照ProductName和SaleDat
recommend-type

JSBSim Reference Manual

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