任意长的整数加法Word文档格式.docx
- 文档编号:5646685
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:22
- 大小:209.83KB
任意长的整数加法Word文档格式.docx
《任意长的整数加法Word文档格式.docx》由会员分享,可在线阅读,更多相关《任意长的整数加法Word文档格式.docx(22页珍藏版)》请在冰点文库上搜索。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3.培养算法分析能力。
分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平
1.设计思想
1.1设计内容
【问题描述】
设计一个实现任意长的整数进行加法运算的演示程序
【基本要求】:
利用双向循环链表实现长整数的存储,每个结点含一个整形变量。
任何整形变量的范围是-(215-1)~(215-1)。
输入和输出形式:
按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
【测试数据】
(1)0;
0;
应输出“0”。
(2)-2345,6789;
-7654,3211;
应输出“-1,0000,0000”。
(3)-9999,9999;
1,0000,0000,0000;
应输出“9999,0000,0001”。
(4)1,0001,0001;
-1,0001,0001;
(5)1,0001,0001;
-1,0001,0000;
应输出“1”。
(6)-9999,9999,9999;
-9999,9999,9999;
应输出“1,9999,9999,9998”。
(7)1,0000,9999,9999;
1;
应输出“1,0001,0000,0000”。
1.2向循环链表作存储结构
为实现上述程序功能,应以双向循环链表表示长整数。
为此,需要定义一个抽象数据类型。
建立双向循环链表方式。
查找函数采用链表的方式进行算法。
有创建链表(InitNode),释放空间(FreeNode),求和(Func_Add),获取数字(Func_GetNum)和输入(printf)等函数组合而成的源程序
对求任意长的整数加法进行双向循环链表方式。
在进位的问题上,若要进位的话,就从右往左依次进行进位;
若不要进行进位的话,就直接相加
2.概要设计(程序模块分析)
2.1为链表指针申请空间模块
链表申请空间存储实现长整数,并且及时清空,释放占空间的整数,避免浪费存储空间
#include"
stdio.h"
string.h"
typedefstructNode
{
structNode*pre;
charNumber[5];
//用来存放4个字符末尾加个0
structNode*next;
}Node_t;
/*为链表指针申请空间*/
voidInitNode(Node_t**node)
*node=(Node_t*)malloc(sizeof(Node_t));
memset((*node)->
Number,0x00,sizeof((*node)->
Number));
(*node)->
pre=NULL;
next=NULL;
}
2.2数求和模块
加法函数:
先找到链表尾部进行进位加法,把同长度部分搞定然后再长的那条表操作
Node_t*Func_Add(Node_t*operate1,Node_t*operate2)
Node_t*node1=operate1;
Node_t*node2=operate2;
Node_t*Result=NULL,*ReturnNode=NULL,*NewNode;
charTempStr[6];
intAdda=0,Addb=0,IndexA=0,IndexB=0;
intCarry=0;
while(node1->
next!
=NULL)
node1=node1->
next;
IndexA++;
while(node2->
node2=node2->
IndexB++;
if(IndexA>
IndexB)//得到长的那条链表做为存结果
Result=node1;
else
Result=node2;
while((node1!
=NULL)&
&
(node2!
=NULL))
Adda=atoi(node1->
Number);
//字符转整形
Addb=atoi(node2->
memset(TempStr,0x00,6);
itoa(Adda+Addb+Carry,TempStr,10);
//结果转字符结果可能是进位+4个需要数据或只有4个需要数据
if(Adda+Addb+Carry>
=10000)
Carry=1;
Carry=0;
//printf("
Result=%s,Carry=%d\n"
TempStr,Carry);
//打印信息有帮助
memcpy(Result->
Number,TempStr+Carry,4);
//拷值时有进位第一个不拷,没进位就全拷进位已经记住给下一次加
ReturnNode=Result;
//备分返回使用
Result=Result->
pre;
while(Result)//如果俩链表不等长
Adda=atoi(Result->
itoa(Adda+Carry,TempStr,10);
if(Adda+Carry>
//拷值时有进位第一个不拷,相反就全拷
if((Result->
pre==NULL)&
Carry)
2.3创建链表模块
创建一个双向循环链表,输入新的数,结果会是这个新的数,按照这样依次下去
InitNode(&
NewNode);
Result->
pre=NewNode;
NewNode->
next=Result;
returnReturnNode;
2.4获取整数模块
获取字符串,将输入的字符串分给链表单元,开头为最高位,10位数字则为2,4,4
voidFunc_GetNum(Node_t*node,char*InputStr)
Node_t*TempNode=node;
Node_t*NewNode=NULL;
char*TempStr=InputStr;
intIndex=0,Offset=0;
intStrLen=strlen(InputStr);
if(!
(StrLen%4))
Offset=4;
Offset=StrLen%4;
//为最高位计算为数10%4=2
StrLen=StrLen-Offset;
while(StrLen>
0)
TempNode->
next=NewNode;
pre=TempNode;
TempNode=TempNode->
memcpy(TempNode->
Number,TempStr+Index+Offset,4);
//4位4位拷的链表里
StrLen-=4;
Index+=4;
memcpy(node->
Number,TempStr,Offset);
//最高位拷值
2.5输入任意长整数的模块
输入任意长的两个整数相加
voidPrintfNode(Node_t*node)
printf("
%s"
TempNode->
while(TempNode!
%s"
\n"
);
2.6释放空间模块
释放空间,避免字符串占空间,清楚多余的空间
voidFreeNode(Node_t*node)
Node_t*TempNode=node,*Temp;
while(TempNode)
Temp=TempNode->
free(TempNode);
TempNode=Temp;
2.7主函数(main)设计模块
该模块功能主要是给用户提供清晰的可操作界面,易于人机操作。
并能很好的调用其他各模块,使程序更加优化,思路更加清晰,结构更加明了。
提高了程序的实用性。
voidmain()
inti=10;
charstr[128];
Node_t*node1,*node2,*Result;
while(i--)
node1);
node2);
memset(str,0x00,sizeof(str));
gets(str);
Func_GetNum(node1,str);
Func_GetNum(node2,str);
FuncStart\n"
PrintfNode(node1);
+\n"
PrintfNode(node2);
Result=Func_Add(node1,node2);
PrintfNode(Result);
/*释放由于我将结果保留在加数1或加数2中长的那条链表中如果有进位的话还多申请一个空间存放
所以释放的时候就要判断到底是哪条链表*/
if(Result==node1||Result->
next==node1)
FreeNode(Result);
FreeNode(node2);
if(Result==node2||Result->
next==node2)
FreeNode(node1);
}
3.算法描述(流程图及源代码)
3.1双向循环链表结构程序流程图
3.2源代码
ructNode*pre;
arNumber[5];
structNode*next;
ode=(Node_t*)malloc(sizeof(Node_t));
mset((*node)->
IndexB)/
while(Result)
4.运行程序及结果
对程序进行调试,无误后运行该程序,输入两个任意长的整数相加求和,
5.心得体会
1、进一步熟悉掌握了双向循环链表的基本操作;
2、熟悉任意长字符串的输入,并实现把字符串转化为整数;
3、熟悉任意长整数的加法运算;
4、更进一步掌握有关类的操作
5、由于对任意长整数运算的算法推敲不足,是程序调试时费时不少
6、本程序有些代码重复出现,从而减少了空间的利用率和增加了程序代码的杂乱性
课程设计评分表
学生姓名:
项目内容
满分
实评
选
题
能结合所学课程知识、有一定的能力训练。
符合选题要求
(5人一题)
10
工作量适中,难易度合理
能
力
水
平
能熟练应用所学知识,有一定查阅文献及运用文献资料能力
理论依据充分,数据准确,公式推导正确
能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等
能体现创造性思维,或有独特见解
成
果
质
量
总体设计正确、合理,各项技术指标符合要求。
说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;
分析处理科学、条理分明、语言流畅、结构严谨、版面清晰
设计说明书栏目齐全、合理,符号统一、编号齐全。
格式、绘图、表格、插图等规范准确,符合国家标准
有一定篇幅,字符数不少于5000
总分
100
指导教师
指导教师签名:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 任意 整数 加法