长整数的四则运算_第1页
长整数的四则运算_第2页
长整数的四则运算_第3页
长整数的四则运算_第4页
长整数的四则运算_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、天津理工大学实验报告学院(系)名称:计算机与通信工程学院姓名黄雅娇学号20145777专业信息安全班级四班 实验项目长整数四则运算计算器课程名称数据结构与算法课程代码0661013实验时间2016年03月15日实验地点主校区软件实验室 7-215批改意见成绩教师签字: 1、 实验目的:2、 本实验的目的是进一步理解双向循环表的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。 二、实验问题描述 设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加、减运算,乘除运算可选做。在这里长整数没有范围限制,可任意长。运算后的进位、借位等都要进行正确处理,可

2、实现动态的输入,实时的输出。 三、实验步骤1、 数据结构 利用双向循环链表来实现对长整数的存储。 选择该数据结构来完成长整数的加减运算是因为 a. 要对长整数进行运算,需要对长整数进行存储,选择用链表对长整数存储。 b. 存储的顺序是从左到右,运算的顺序则是从右到左,为操作方便选择循环链表。 c. 在运算过程中有进位和借位的操作。 2、 使用算法    定义双向循环链表,存储数据,进行计算。(默认较长的数作为被加数、被减数) 

3、四、实验程序及分析#include <iostream>using namespace std; #include <math.h>#include <string.h>#define Max 1024class CLongInt bool symbol; /数字符号 int digit; /数字位数 char numeralMax; /用来存放各位的数字public: CLongInt(char* str) symbol=true; digit=0; memset(numeral,0,Max); input(str); CLongInt() symbol=

4、true; /默认为正数 digit=0; /默认为0 numeral0='0' friend ostream& operator <<(ostream& os,CLongInt& d); friend istream& operator >>(istream& is,CLongInt& d); friend CLongInt abs_add(CLongInt c1,CLongInt c2); /绝对值相加 friend CLongInt abs_minus(CLongInt c1,CLongInt c2)

5、; /绝对值相减 friend CLongInt abs_mul(CLongInt c1,CLongInt c2); /绝对值相乘 friend CLongInt abs_mul(CLongInt c1,int abs,int size); /friend CLongInt abs_div(CLongInt c1,CLongInt c2); /绝对值相除 int CompareLongInt(CLongInt c1,CLongInt c2); / 比较长整数大小 void input(char* str); void print(); CLongInt operator +(CLongInt

6、d); CLongInt operator -(CLongInt d); CLongInt operator *(CLongInt d); ;void CLongInt:print() int i; if(symbol=false) cout<<"-" for(i=digit-1;i>=0;i-) cout<<numerali; /puts(numeral); int CLongInt:CompareLongInt(CLongInt c1,CLongInt c2) /0大于,1等于,2小于 int i; if(c1.symbol=c2.symb

7、ol) /比较的两者符号相同 if(c1.symbol=true) if(c1.digit>c2.digit) return 0; else if(c1.digit<c2.digit) return 2; else /两者长度相等 for(i=c1.digit-1;i>=0;i-) if(c1.numerali>c2.numerali) return 0; break; else if(c1.numerali<c2.numerali) return 2; break; if(i=-1) return 1; if(c1.symbol=false) if(c1.dig

8、it>c2.digit) return 2; else if(c1.digit<c2.digit) return 0; else /两者长度相等 for(i=c1.digit-1;i>=0;i-) if(c1.numerali>c2.numerali) return 2; break; else if(c1.numerali<c2.numerali) return 0; break; if(i=-1) return 1; else /比较的两者符号不同 if(c1.symbol=true) /前正后负 return 0; else if(c1.symbol!=tr

9、ue) return 2; void CLongInt:input(char *str) this->digit=0; int i=0,j=0; int len=strlen(str); char *s=(char*)str; if(*str<='9'&&*str>='0') this->symbol=true; this->digit = len; else if(*str='-') i+; this->digit = len-1; this->symbol=false; else if

10、(*str='+') i+; this->digit = len-1; this->symbol=true; else cout<<"数据输入错误,请重新输入!" return; while(i<len) /除了第一位其他位都应该是数字 if(si>'9'|si<'0') /cout<<"liufenfen"<<si<<endl; this->digit=0; cout<<"数据输入错误,请重新输入!&

11、quot; return; else this->numeralthis->digit-j-1=si; /除去正负号 this->numeralthis->digit = '0' i+; j+; CLongInt abs_add(CLongInt c1,CLongInt c2) /绝对值相加 CLongInt temp; int carry = 0; /标记进位 int i,number = 0; if(c1.digit>=c2.digit) /前一个数比后一个数位数要大 for(i=0;i<c2.digit;i+) /cout<<

12、;"c1:"<<c1.numerali<<endl; /cout<<"c2:"<<c2.numerali<<endl; /cout<<"c1+c2:"<<(c1.numerali-'0')+(c2.numerali-'0')<<endl; temp.numerali=(c1.numerali-'0')+(c2.numerali-'0')+carry)%10 + 48; /转化成

13、数字运算然后转化成字符 /每次进位后将进位清零 if(c1.numerali-'0')+(c2.numerali-'0')+carry)/10=1) /有进位 carry = 1; else carry=0; for(i=c2.digit;i<c1.digit;i+) /超越的位数 temp.numerali=(c1.numerali-'0')+carry)%10+48; if(c1.numerali-'0')+carry)/10=1) carry = 1; else carry=0; if(carry = 1) /最高位进

14、位判断 temp.digit=c1.digit+1; temp.numeralc1.digit = '1' temp.numeralc1.digit+1 = '0' else temp.digit=c1.digit; temp.numeralc1.digit = '0' else /后一个位数要大 for(i=0;i<c1.digit;i+) /cout<<"c1:"<<c1.numerali<<endl; /cout<<"c2:"<<c2.

15、numerali<<endl; /=cout<<"c1+c2:"<<(c1.numerali-'0')+(c2.numerali-'0')<<endl; temp.numerali=(c1.numerali-'0')+(c2.numerali-'0')+carry)%10 + 48;/转化成数字运算然后转化成字符 if(c1.numerali-'0')+(c2.numerali-'0')+carry)/10=1) /有进位 carr

16、y = 1; else carry=0; /每次进位后将进位清零 for(i=c1.digit;i<c2.digit;i+) /超越的位数 temp.numerali=(c2.numerali-'0')+carry)%10+48; if(c2.numerali-'0')+carry)/10=1) carry = 1; else carry=0; if(carry = 1) /最高位进位判断 temp.digit=c2.digit+1; temp.numeralc2.digit = '1' temp.numeralc2.digit+1 = &

17、#39;0' else temp.digit=c2.digit; temp.numeraltemp.digit = '0' return temp;CLongInt abs_minus(CLongInt c1,CLongInt c2) /绝对值相减 CLongInt temp; int carry=0; /carry表示借位 if(c1.digit>c2.digit) /前者位数大于后者 for(int k=0;k<c2.digit;k+) if(c1.numeralk='0'&&carry=1) c1.numeralk =

18、'9' carry = 1; else if(carry = 1) c1.numeralk=(c1.numeralk-'0') - 1 + 48; carry = 0; if(c1.numeralk<c2.numeralk) carry = 1; temp.numeralk = (c1.numeralk-'0')+10-(c2.numeralk-'0') + 48; else temp.numeralk = (c1.numeralk-'0')-(c2.numeralk-'0') + 48; f

19、or(int k=c2.digit;k<c1.digit;k+) if(c1.numeralk='0'&&carry=1) temp.numeralk = '9' carry = 1; else if(carry = 1) temp.numeralk=(c1.numeralk-'0') - 1 + 48; carry = 0; else temp.numeralk = c1.numeralk; temp.digit=c1.digit; temp.numeralc1.digit = '0' int k=c1.d

20、igit-1; while(temp.numeralk='0') temp.digit-; temp.numeralk = '0' k-; else if(c1.digit=c2.digit) /两者位数相等且前者大于后者 carry=0; for(int k=0;k<c2.digit;k+) if(c1.numeralk='0'&&carry=1) c1.numeralk = '9' carry = 1; else if(carry = 1) c1.numeralk=(c1.numeralk-'0&

21、#39;) - 1 + 48; if(c1.numeralk<c2.numeralk) carry = 1; temp.numeralk = (c1.numeralk-'0')+10-(c2.numeralk-'0') + 48; else carry = 0; temp.numeralk = (c1.numeralk-'0')-(c2.numeralk-'0') + 48; temp.digit=c1.digit; temp.numeralc1.digit = '0' int k=c1.digit-1; w

22、hile(temp.numeralk='0') temp.digit-; temp.numeralk = '0' k-; return temp;CLongInt abs_mul(CLongInt c1,CLongInt c2) /绝对值相乘 CLongInt temp,mid; /中间值 int i; temp.numeral0='0' temp.digit=1; temp.numeral1='0' for(i=0;i<c2.digit;i+) int cn=c2.numerali-'0' mid=abs_

23、mul(c1,cn,i); temp=abs_add(temp,mid); return temp;CLongInt abs_mul(CLongInt c1,int abs,int size) /单位数与长整数相乘 CLongInt temp; int i,carry=0; temp.digit=c1.digit; for(i=0;i<c1.digit;i+) int mid=(c1.numerali-'0')*abs+carry; temp.numerali=mid%10 + 48; carry=mid/10; temp.numeralc1.digit = '0

24、' if(carry>0) temp.digit+; temp.numeralc1.digit = carry + 48; temp.numeraltemp.digit = '0' if(size!=0) for(i=temp.digit;i>=0;i-) temp.numerali+size = temp.numerali; for(i=0;i<size;i+)/在移位后的数据后面添加size个0 temp.numerali = '0' temp.digit+=size; return temp;CLongInt CLongInt:o

25、perator +(CLongInt d) int i=0; CLongInt temp; if(symbol=d.symbol) /相加的两个数符号相同 temp=abs_add(* this,d); temp.symbol=symbol; else /如果两者符号不同 if(digit>d.digit) /前者大于后者 temp=abs_minus(* this,d); /做减法 temp.symbol=symbol; else if(digit=d.digit) /两者长度相等 for(i=digit-1;i>=0;i-) if(numerali>d.numerali)

26、 /前者数值大于后者 temp.symbol=symbol; temp=abs_minus(*this, d); else if(numerali<d.numerali) /后者数值大于前者 temp.symbol=d.symbol; temp=abs_minus(d,*this); else temp.numeral0='0' /两者相等 temp.symbol=true; else /前者长度小于后者长度 temp=abs_minus(d ,*this); temp.symbol=d.symbol; return temp; CLongInt CLongInt:ope

27、rator -(CLongInt d) int i=0; CLongInt temp; if(this->symbol=d.symbol) /相减的两数符号相同 if(this->digit>d.digit) /前者位数大于后者位数 temp=abs_minus(*this,d); temp.symbol=symbol; else if(this->digit=d.digit) /前者位数等于后者位数 for(i=digit-1;i>=0;i-) if(this->numerali>d.numerali) /前者大于后者 temp=abs_minus(

28、*this, d); temp.symbol=symbol; break; else if(numerali<d.numerali) /后者大于前者 temp=abs_minus( d, * this); temp.symbol=(!d.symbol); break; if(i = -1) temp.numeral0='0' temp.digit=1; temp.numeral1='0' temp.symbol=true; else /前者位数小于后者 temp=abs_minus( d, * this); temp.symbol=(!d.symbol);

29、 else /相减两数符号相异 if(this->symbol=true && d.symbol=false) temp=abs_add(* this , d); temp.symbol=true; else if(this->symbol=false &&d.symbol=true) temp=abs_add(* this , d); temp.symbol=false; return temp;CLongInt CLongInt:operator *(CLongInt d) / 重载乘法 int i=0; CLongInt temp; temp.

30、symbol=symbold.symbol; temp=abs_mul(* this, d); return temp; int main(void) char test1128,test2128; int temp=1; char command; CLongInt t1,t2,t3; while(temp) cout<<"-n" cout<<"*n" cout<<"* tt1 加法运算 tt*n" cout<<"* tt2 减法运算 tt*n" cout<&

31、lt;"* tt3 乘法运算 tt*n" cout<<"* tt4 比较大小tt*n" cout<<"* tt0 退出 tt t*n" cout<<"-n" cout<<"请输入指令:" cin>>command; switch(command) case '0': temp=0; cout<<"n-n" cout<<"n=>欢迎使用该系统!再见!<=n" cout<<"n-n" break; case '1': cout<<"请输入数据:" cin>>test1>>test2; t1.input(test1); t2.input(test2); cout<<"n运算的结果为: " t3=t1+t2; t3.print(); cout<<endl; break; case '2': cou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论