数据结构与算法--大整数相加(张胜)

合集下载

大整数相加a+b的c语言实现

大整数相加a+b的c语言实现

⼤整数相加a+b的c语⾔实现终于来到我所期盼的⾼精度整数相加的题⽬了。

这个题很经典,也算是⼀个很好的算法⼊门题吧。

如果是java的话,系统类库已经内置了BigInteger类,直接调⽤就可以很轻易地解决了。

但是学习c的编写也是⾮常有意义的。

解题思路1、⾸先⽤两个数组s1,s2临时存放输⼊的数据2、输⼊以后将两个数组s1、s2以si[i]-'0'的⽅式把输⼊的字符串型数字转化为int型的数字。

注意转换的过程中,要倒过来存,以便相加的时候低位的对齐,从低位开始相加。

3、相加的过程:同位相加,相加的结果存放在num1[i]⾥。

如果结果>10,num[i+1]要进位(+1),并且num1[i]存放结果-10(只存放个位)4、输出时:相加的过程中变量i⼀直向后移,到了最后会停在max(len(s1),len(s2))+1的位置。

如果前⾯的加法恰好在最⾼位也进1,此时num1[i]就不为零。

此时就要把这个多出来的⾼位也输出。

反则不需要输出。

其他详解看代码注释。

1 #include<stdio.h>2 #include<string.h>3int main()4 {5char s1[1000],s2[1000];6int num1[1000],num2[1000],len1,len2,i,j;7 memset(num1,0,sizeof(num1));8 memset(num2,0,sizeof(num2));9while(scanf("%s%s",s1,s2)!=EOF)10 {11 len1=strlen(s1);12 len2=strlen(s2);13for(i=len1-1,j=0; i>=0; --i) //从后往前处理⼤数字符串,把字符串变成数字组14 {1516 num1[j]=s1[i]-'0';17 j++;1819 }20for(i=len2-1,j=0; i>=0; --i)21 {22 num2[j]=s2[i]-'0';23 j++;2425 }26//相加的处理,把num2的数加到i1中。

数据结构课程设计实践报告大整数加法

数据结构课程设计实践报告大整数加法

数据结构课程设计实践报告大整数加法下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

本文下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Downloaded tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The documentscan be customized and modified after downloading, please adjust and use it accordingto actual needs, thank you!In addition, our shop provides you with various types of practical materials, suchas educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!第一节。

长整数的加法运算-数据结构与算法课程设计

长整数的加法运算-数据结构与算法课程设计

题目:长整数的加法运算学院:计算机科学与工程学院专业:信息安全******学号:**********指导教师:***2014年10月18日目录引言 (4)1、系统概述 (4)2、系统分析 (5)2.1需求分析 (5)2.2系统功能 (5)2.3开发环境 (5)3、详细设计 (5)3.1功能结构框图 (6)3.2 软件设计 (6)3.2.1 定义链表与接收数据输入 (6)3.2.2长整数的加法运算 (8)3.2.3显示长整数相加结果 (10)4、所遇到的问题和分析解决 (10)5、系统特色及关键技术 (11)6、结论 (11)参考文献 (12)引言随着计算机技术的发展,人们利用计算机开发了许许多多方便的,实用的应用软件,在信息化的现代社会里,人们依赖着很多的应用软件,这些软件在推进社会发展的同时,也丰富了人们的生活,然而,在开发过程中,由于计算机系统的局限性,在需要某些功能时,总会遇到困难。

例如在开发某些工程项目时,有时需要对很大的数进行计算。

但是计算机本身无法计算某些较大的数,所以我们有必要设计专门的算法对一些较大的数进行相应的计算,通过简化运算之后,对其他程序功能的编写能起到良好的促进作用,大大的减轻了程序员的负担。

此次设计的程序将用于长整数的加法运算,程序运行时,将提示用户输入两个长整数,然后将两个长整数相加的结果输出。

1、系统概述在该长整数加法运算系统中,我将定义双向循环链表来表示长整数,按照中国对长整数的表示方法,如199999999表示为1,9999,9999。

双向循环链表数据域存储的是长整数的每4位。

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。

所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

通过造双向循环链表,可以对长整数进行方便的存储,在对长整数进行数学运算时,也能通过方便的操作链表,从而对长整数进行需要的计算。

数据结构课程设计长的整数加法

数据结构课程设计长的整数加法

数据结构课程设计题目名称:长的整数加法计算机科学与技术学院一、需求分析1.问题描述:设计一个程序实现两个任意长的整数的求和运算。

2.基本要求:利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。

要求输入和输出每四位一组,组间用逗号隔开。

如:1,0000,0000,0000,0000。

3.任务陈述:(a)输入的形式和输入值的范围:本实验中演示中,长整数的每位上的数字必须为数字[0 ——9]之间,长整数的位数要求无限长。

测试的时候输入数据,当输入回车键的时候结束输入,如果输入的字符不符合题目要求,则程序能过滤这些不符合要求的字符。

(b)输出的形式: 整数的范围无限制,可为正数,可为负数。

按照中国对于长整数的表示习惯,每四位是一组,组间用逗号隔开。

(c)程序所能达到的功能: 演示程序以用户和计算机的对话方式执行,即在计算机显示“提示信息”后之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后,并对错误。

(d)测试数据: ①—⑧为正确输入数据,⑨为错误输入数据( 超出 4 位) ,⑩为错误输入数据( 不足 4 位)。

①两长整数a=b=0请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234---- 按该模式输入输入长整数 a您的输入结果为:0 ---------------------- 显示a(防止错误输入)请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234---- 输入长整数 b 您的输入结果为:您的运算结果为:输出②b>a>01,1111,1111,1111您的输入结果为:1,1111,1111,11119,9999,9999,9999您的输入结果为:9,9999,9999,9999您的运算结果为:11,1111,1111,1110③a>b>09999,9999,9999您的输入结果为:9999,9999,9999请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234 请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234 请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234您的输入结果为:2您的运算结果为:1,0000,0000,0001 ④b<a<0请按照如下形式输入第一个长整数,每四位一组-2345,6789您的输入结果为:-2345,6789请按照如下形式输入第二个长整数,每四位一组-7654,3211您的输入结果为:-7654,3211您的运算结果为:-1,0000,0000⑤a<0,b>0,|a|>|b|请按照如下形式输入第一个长整数,每四位一组-1,0000,00001您的输入结果为:-1,0000,0001请按照如下形式输入第二个长整数,每四位一组2您的输入结果为:: -1234,1234,1234 : -1234,1234,1234 : -1234,1234,1234 : -1234,1234,12342您的运算结果为:-9999,9999⑥a<0,b>0,|a|<|b|请按照如下形式输入第一个长整数,每四位一组-9999您的输入结果为:-9999请按照如下形式输入第二个长整数,每四位一组1,0000您的输入结果为:1,0000您的运算结果为:1⑦a>0,b<0,|a|>|b|请按照如下形式输入第二个长整数,每四位一组1,0000,0000您的输入结果为:1,0000,0000请按照如下形式输入第二个长整数,每四位一组-9999您的输入结果为:-9999您的运算结果为:9999,0001⑧a>0,b<0,|a|<|b| : -1234,1234,1234: -1234,1234,1234: -1234,1234,1234: -1234,1234,1234请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234您的输入结果为: 1请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234-1,0000,0000您的输入结果为:-1,0000,0000您的运算结果为:-9999,9999⑨错误输入(例:输入超过四位,则自动取其前四位进行运算)请按照如下形式输入第一个长整数,每四位一组: -1234,1234,12341,00000您的输入结果为:1,0000请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234-99998,01234您的输入结果为:-9999,1234您的运算结果为:-9998,1234⑩错误输入(例:非第一次输入少于四位,则在输入前加0 补足四位进行运算)请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234 1,000您的输入结果为:1,0000请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234-1,11您的输入结果为:-1,0011您的运算结果为:-11二、概要设计1.目标需求与设计思想通过尾插输入长整数,为实现顺序存入,并用头插存储的运算后的长整数,因为运算必定从后向前计算,同样为了实现顺序存入。

数据结构课程设计长整数加减运算

数据结构课程设计长整数加减运算

课程名称数据结构课程设计题目长整数加减运算一、需求分析设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。

长整数的长度没有限制,可以是任意长。

正确处理好运算之后的进位和借位。

(1)输入:[-]**,****,****;[-]*,****,****,**** //[-]表示“-”可选(2)输出:**,****,****,****是否继续计算(Y/N):(3)功能:能正确进行相关数据的加减运算(4)测试数据:0;0;输出“0”2345,6789;7654,3211;输出“1,0000,0000”1,0000,0000,0000;-9999,9999;输出“9999,0000,0001”1,0001,00001;-1,0001,0000;输出“0”自选数据二、概要设计1、使用双向循环链表实现长整数的运算及存储,构造双向循环链表,创建双向循环链表表示两个整数2、设计两整数相加的函数Add(),addtwo(),其中Add()调用addtwo()函数,addtwo()具体实现两个整数的加减操作,进位及借位问题;设计显示函数Display()及主函数main()三、详细设计1、数据结构设计双向循环链表的构造t ypedef struct LinkNode{int data; //记录每个节点的整数(小于)LinkNode *next, *pre; //记录下一个节点的地址和前一个节点的地址}linklist;2、创建两个长整数的链表伪算法void Creat(char a[]) //引入字符串,创立两个链表,分别表示两个整数{int 记录字符串i;记录加数节点数j;记录被加数节点数s;标记字符串中的‘-’号记录字符串中的字符转化为整数的值k,使每个节点记录位l while(指针所指不是“;”)被加数字符数m自动加1 //m记录字符串中被加数的字符数n=m;while(执政没有指到结尾处) 总字符串n位数自动加1; //n记录字符串的总字符数if被加数不是负数{head0->data=(-1); //记录整数符号w=1;}else {head0->data=1;}for(i=m-1;i>=w;i--){If指针所指为数字,而不是“,” //把字符转化为整数{k+=(a[i]-'0')*sum(l); //sum()计算的乘方l++;}if(a[i]==','||i==w){把整数存到双向循环链表中s++; //节点数加k=0; //重新初始化k和ll=0;}}head0->pre->data*=s; //存储整数符号和节点数}四、调试分析a、调试过程中,连续输入数字运算,速度会明显变慢,发现在初始化链表及运算后没有释放链表,造成系统资源浪费,经改造后自爱后面添加了析构函数b、算法的时空分析创建整数链表有三个循环,次数都为n。

数据结构实训(一)---大整数求和

数据结构实训(一)---大整数求和

数据结构实训(⼀)---⼤整数求和【问题描述】⼤整数求和⽤某种程序设计语⾔进⾏编程时,可发能需要处理⾮常⼤或者运算精度要求⾮常⾼的整数(称为⼤整数),这种⼤整数⽤该语⾔的基本数据类型⽆法直接表⽰。

处理⼤整数的⼀般⽅法是⽤数组存储⼤整数,即开辟⼀个⽐较⼤的整型数组,数组元素代表⼤整数的⼀位,通过数组元素的运算模拟⼤整数的运算。

已知⼤整数,,求C=A+B。

可以⽤两个顺序表A和B分别存储两个⼤整数,⽤顺序表C存储求和结果。

为了便于执⾏加法运算,可以将⼤整数的低位存储到顺序表的低端,顺序表的长度表⽰⼤整数的位数。

【输⼊形式】两个⼤整数的数位数字。

【输出形式】按照从⾼位到低位的顺序输出求和结果C。

【样例输⼊】98765432199997531【样例输出】1087651852【说明】如果从键盘输⼊⼤整数,⼀般⽤字符数组存储,这样⽆需对⼤整数进⾏分段输⼊,当然输⼊到字符数组后需要将字符转换为数字。

#include<iostream>#include<string>using namespace std;const int MaxSize = 1000;int main(){string s1,s2;cin >> s1 >> s2;int* num1 = new int[MaxSize];int* num2 = new int[MaxSize];int* num3 = new int[MaxSize+1];int len1 = s1.size();int len2 = s2.size();for(int i=0; i < len1; i++){int temp = s1[i] - '0';num1[s1.size()-1-i] = temp;}for(int i=0; i < len2; i++){int temp = s2[i] - '0';num2[s2.size()-1-i] = temp;}int over = 0;int length = 0;for(int i=0; i<len1||i<len2; i++){num3[i] = (num1[i] + num2[i] + over)%10;over = (num1[i] + num2[i] + over)/10;length++;}if(over > 0){num3[length] = over;}else{length--;}for(int i=length; i>=0 ; i--){cout<<num3[i];}}。

实现大整数的加法和减法(C++)

实现大整数的加法和减法(C++)

实现大整数的加法和减法(C++)大整数加法和减法是在计算机科学中常见的问题。

由于计算机内部的整数类型范围有限,当需要处理超出这个范围的大整数时,就需要借助特殊的算法和数据结构来进行计算。

对于大整数的加法,我们可以借鉴小学学习的加法规则,从低位开始,逐位相加,并考虑进位的情况。

具体而言,对于两个大整数的相同位置上的位数,我们可以直接相加,并将结果存储在新的大整数中,如果结果超过了当前位置的表示范围,则将进位保存,并在下一位计算时加上。

最后,如果最高位产生进位,需要将这个进位也加入结果中。

例如,假设我们要计算大整数1234567890和9876543210的和。

我们从低位开始相加,首先计算个位数0和0的和,结果为0。

接着计算十位数9和1的和,结果为10,即个位数为0,十位数需要进位。

然后计算百位数8、千位数7和万位数6的和,依次类推。

最后得到的结果为11111111100。

而对于大整数的减法,我们可以借鉴小学学习的减法规则,从低位开始逐位相减,并考虑借位的情况。

具体而言,对于两个大整数相同位置上的位数,如果被减数大于减数,直接相减,结果存储在新的大整数中;如果被减数小于减数,需要向高位借位。

最后,如果最高位产生借位,需要将这个借位也减去。

假设我们要计算大整数9876543210减去1234567890的差。

我们从低位开始逐位相减,首先计算个位数0减去0的差,结果为0。

接着计算十位数1减去9的差,由于1小于9,需要向高位借位,得到借位后结果为11减去9,结果为2。

然后计算百位数8减去8的差,结果为0,千位数7减去7的差,结果为0,依次类推。

最后得到的结果为8641975320。

然而,大整数的加法和减法问题并不仅仅需要解决进位和借位的问题,还需要考虑大整数的存储和表示方式。

在C++中,可以使用字符串来存储大整数,并通过自定义的算法进行计算。

例如,我们可以使用字符串的每一位来表示大整数的每一位,并通过字符串相应位置上的字符来进行加法和减法运算。

毕业设计-设计并实现大整数(超过十位的整数)的加减乘除运算

毕业设计-设计并实现大整数(超过十位的整数)的加减乘除运算

目录第1章课题概述 (1)1.1课题的目的 (1)1.2课题的要求 (1)1.2.1 输入输出的要求 (1)1.2.2 程序实现的功能要求 (1)第2章概要设计 (3)2.1整个程序的模块结构及流程 (3)2.2大整数存储结构的选择 (3)2.3输入数据合法性的检测及初步处理 (4)2.4各个操作算法的描述 (5)2.4.1 相加算法 (5)2.4.2 相减算法 (7)2.4.3 相乘算法 (8)2.4.4 相除算法 (10)第3章程序功能的实现 (16)3.1主函数的实现 (16)3.2主要功能模块的实现 (18)3.2.1 加法的实现 (18)3.2.2 减法的实现 (19)3.2.3 乘法的实现 (22)3.2.4 除法的实现 (23)第4章调试及发现问题的解决 (29)第5章程序测试及分析 (31)第6章总结 (37)参考文献 (39)第1章课题概述本次数据结构课程设计的题目是设计并实现大整数(超过十位的整数)的加减乘除运算。

1.1 课题的目的整数的加减乘除运算是日常生活中常见的四则数学运算。

在不借助计算器的手工条件下,人们往往会通过列竖式的形式来计算结果。

当借助计算机来运算时,虽然不用列竖式那么麻烦了,但是由于计算机对于整数的存储往往只有2B或4B 的空间,因此能够表示的整数存储范围比较有限。

即使采用四个字节来存储整数,它所能表示的范围为:[-2147483648,+2147483647]。

一般称超过十位以上的十进制整数为大整数,这类大整数在C语言系统中因超界溢出,是不能直接用基本数据类型来表示和计算的。

因此,采用特定的数据结构和算法,通过编写计算机程序的方式来实现这些功能,无疑具有较大的实际意义。

1.2 课题的要求1.2.1 输入输出的要求(1)程序运行后应首先输出一个主菜单,并将所有的加、减、乘、除等功能罗列在主菜单上供用户进行选择,以便进行相应的操作。

(2)运算对象应能够从键盘输入,并且运算过程中可以不断更新运算的输入数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验课程名称数据结构与算法
实验项目名称大整数相加
年级 2010级
专业信息与计算机科学
学生姓名张胜
学号 1007010162
理学院
实验时间:2012 年9 月13 日
学生实验室守则
一、按教学安排准时到实验室上实验课,不得迟到、早退和旷课。

二、进入实验室必须遵守实验室的各项规章制度,保持室内安静、整洁,不准在室内打闹、喧哗、吸烟、吃食物、随地吐痰、乱扔杂物,不准做与实验内容无关的事,非实验用品一律不准带进实验室。

三、实验前必须做好预习(或按要求写好预习报告),未做预习者不准参加实验。

四、实验必须服从教师的安排和指导,认真按规程操作,未经教师允许不得擅自动用仪器设备,特别是与本实验无关的仪器设备和设施,如擅自动用或违反操作规程造成损坏,应按规定赔偿,严重者给予纪律处分。

五、实验中要节约水、电、气及其它消耗材料。

六、细心观察、如实记录实验现象和结果,不得抄袭或随意更改原始记录和数据,不得擅离操作岗位和干扰他人实验。

七、使用易燃、易爆、腐蚀性、有毒有害物品或接触带电设备进行实验,应特别注意规范操作,注意防护;若发生意外,要保持冷静,并及时向指导教师和管理人员报告,不得自行处理。

仪器设备发生故障和损坏,应立即停止实验,并主动向指导教师报告,不得自行拆卸查看和拼装。

八、实验完毕,应清理好实验仪器设备并放回原位,清扫好实验现场,经指导教师检查认可并将实验记录交指导教师检查签字后方可离去。

九、无故不参加实验者,应写出检查,提出申请并缴纳相应的实验费及材料消耗费,经批准后,方可补做。

十、自选实验,应事先预约,拟订出实验方案,经实验室主任同意后,在指导教师或实验技术人员的指导下进行。

十一、实验室内一切物品未经允许严禁带出室外,确需带出,必须经过批准并办理手续。

学生所在学院:理学院专业:信息与计算机科学班级:信计101班。

相关文档
最新文档