有符号大整数计算器
计算器按键的使用说明

计算器按键的使用说明.1、电源开关键:ON、OFF2、输入键:0—9、. +/—:正负转换键3、运算功能键:+ - * / (注意:加、减、乘、除键在计算时都可能代替等号键) √:开平方键,用来进行开平方运算。
先输入数字,再按下此键,不必按等号键即可得出结果。
4、等号键:=5、清除键:①C:清除键。
在数字输入期间,第一次按下此键将清除除存储器内容外的所有数值.如果是太阳能计算器,在计算器关闭状态下,按此键则开启电源,显示屏显示出“0”。
②AC或CA键:全部清除键,也叫总清除键,作用是将显示屏所显示的数字全部清除。
③→:右移键。
其功能是荧屏值向右位移,删除最右边的尾数。
④CE:部分清除键,也叫更正键。
其功能是清除当前输入的数字,而不是清除以前输入的数。
如刚输入的数字有误,立即按此键可清除,待输入正确的数字后,原运算继续进行。
如5+13,这时发现“13”输入错了,则按“CE”键就可以清除刚才的“13”,但还保留“5”这个数。
值得注意的是,在输入数字后,按“+”、“-”、“/”、“*”键的,再按“CE”键,数字不能清除。
⑤MC:累计清除键,也叫记忆式清除键。
其功能是清除储存数据,清除存储器内容,只清除存储器中的数字,内存数据清除,而不是清除显示器上的数字。
6、累计显示键:(1)M+:记忆加法键,也叫累加键。
是计算结果并加上已经储存的数;用作记忆功能,它可以连续追加,把目前显示的值放在存储器中(也就是将显示的数字与内存中已有的任何数字相加,结果存入存储器,但不显示这些数字的和)。
如去和小商贩买几种冰淇凌,买5筒五羊牌雪糕,每筒1.6元;买10筒绿色心情,每筒0.8元;买15筒蒙牛布丁,每筒0.4元。
共多少元?如先输入“5×1.6”→按“M+”键(把“5×1.6”的结果计算出来并储存起来)→然后输入“10×0.8”→按“M+”键(把“10×0.8”的结果计算出来并和前面储存的数相加)→接着输入“15×0.4”→按“M+”键(把“15×0.4”的结果计算出来并和前面储存的数相加)→最后按“MR”键(把储存的数全部取出来)→则出结果“22”(2)M-:记忆减法键,也叫累减键。
计算机信息表示与存储

计算机的信息表示与存储1.计算机中的信息单位2.数制及数制转换3.计算机中的数4.编码和文本1. 计算机中的信息单位计算机中采用二进制编码:在冯·诺依曼型计算机中,计算机的内部都是采用二进制的形式来存储信息的。
二进制位(bit):是计算机中最小的信息单位,只有“0”和“1”两种状态。
二进制表示信息的优点:1)易于物理实现2)二进制数运算简单3)机器可靠性高4)通用性强位、字节位(bit):位是度量数据的最小单位,表示一位二进制数字。
字节(Byte):一个字节是8位(bit)二进制,是存放一个英文字母的基本宽度,也是计算机描述信息存储容量的基本单位。
1 Byte = 8 bit一个字节可以表示28=256 种状态K(千)字节1KB = 1024 Byte=210M(兆)字节1MB = 1024 KB =220G(吉)字节1GB = 1024 MB =230T(太)字节1TB = 1024 GB =240字、字长字(word):计算机内部进行信息处理的基本单位。
计算机可以同时处理的二进制数的位数。
字长:一个字所包含的二进制位数。
字长是计算机硬件设计的一个指标,它代表了机器的精度,字长越长,处理速度越快。
字长一般是字节的整数倍。
例:PC486是32位;奔腾机是64位。
2. 数制及数制转换十进制数由0~9共十个数字符号构成,基数是10。
10的i 次幂称为该位的权。
运算原则:逢十进一,借一当十。
如:9+1=10;4+5=9;11-5=6;6783461071081031041021012.=⨯+⨯+⨯+⨯+⨯--基数权数码二进制数由0、1两个数字符号构成,基数是2。
运算原则:逢二进一,借一当二。
如:0+0=0; 0+1=1;1+0=1; 1+1=10;(计数满2向高位进一)0-0=0;1-1=0;1-0=1;八进制数由0~7共八个数字符号构成,基数是8。
运算原则:逢八进一,借一当八。
如:7+1=10;2+5=7;11-5=4;注意:八进制数中不能出现8、9两个数字是错误的。
硬盘分区整数G计算公式及计算器

硬盘分区整数G计算公式及计算器1)我们知道,1GB=1024MB、1TB=1024GB、1PB=1024TB、1EB=1024PB。
如果你想在Windows的“我的电脑”或“计算机”里看到整数G的硬盘分区,就要在分区时进行计算。
2)对于FAT32格式的硬盘分区,由于每1024个字节都会用4个字节来存储磁盘结构和数据存储位置等信息,但分区中的第一GB并不占用额外的存储容量,因此FAT32格式磁盘分区的整数G计算公式为(X-1)*4+1024*X=Y,其中X为你想得到的整数G数(单位为GB),Y为应分配的M数(单位为MB)。
为方便记忆,硬盘整数G计算公式也可写成(G-1)*4+1024*G=M。
3)比如,你想分个100G的整数G分区(FAT32格式),你要在分区软件(比如WinPM)里输入(100G-1)*4+1024*100G=102,796 M才能得到。
因为,Windows 认为100G不等于100,000M,也不等于102,400M,100G=102796 M。
硬盘分区整数G速查表4)对于NTFS格式的硬盘分区,原理比较复杂。
NTFS分区的最小容量不能精确到1MB,而是柱面大小。
硬盘一般有255个磁头,63个扇区,故每个柱面的大小为:512bit*255*63=8,225,280bit=7.84423828125MB。
5)如果要分个10GB的NTFS分区,理应为10*1024MB=10240MB,实际需要的柱面数为10240÷7.84423828125=1305.4。
因柱面只能算整数,即1306个柱面,这样实际分配的M数为1306*7.84423828125=10244.575MB,不管小数点后面几位都进1,也就是10245MB,这样才会被Windows系统认成是10GB。
苏教版四年级下册数学单元测试-4.用计算器计算 (含答案)

四年级下册数学单元测试-4.用计算器计算一、单选题1.计算器上的四则运算键有()。
A. +、-、×、÷B. +、-、×、·C. +、-、×、=2.小力在计算“287×36”时,发现计算器的按键“3"坏了,他想了想,还是用这个计算器算出了正确结果。
他用的方法可能是( )。
A. 287×12×3B. 287×(30+6)C. 287×6×6D. 287×40-43.小明在用计算器计算4000﹣2689时,把减数错输成2986,这时他要按()键清除2986,再输入2689.A. ON/CB. CEC. OFF4.用计算器计算少先队大队部用1720元买来一批钢笔和圆珠笔.每枝钢笔28元,买了40枝,剩下的钱买了12元一枝的圆珠笔,一共买了圆珠笔()A. 1120枝B. 50枝C. 600枝D. 60枝二、判断题5.计算器上的一些功能键,例如:改错键“AC“,可以帮助我们方便地解决问题.()6.算盘上,用一个上珠表示5,一个下珠表示1。
()7.小金在用计算器计算时不小心将819输错成818,这时,她说只要按一下改错键CE键就可以修改回来了,她说的对吗。
三、填空题8.用计算器计算.924+(432-146)=________9.160440是764的________倍.(用计算器计算)10.括号里最大整数应该填几?(可以请计算器帮忙)( ________ )11.用计算器计算34570-8840=________12.用计算器算一算:12345679×9=________ 12345679×18=________12345679×27=________ 12345679×36=________你发现了什么规律?四、解答题13.列式计算.减数是879,被减数是6357,差是多少?14.ON/C键和CE键的功能一样吗?请举例说明。
php科学计数法

php科学计数法PHP科学计数法是一种用于表示大数的数学表示方式,它可以使用尽可能少的字符来表示较大的值。
它由三部分组成:一个数字(十进制数)、一个以e或E开头的指数,以及一个可选的正负号,其中指数也可以是一个带有符号的整数。
在PHP中,科学计数法可以使用字符串形式或浮点数形式来表示。
科学计数法用字符串来表示,它的格式如下:[sign]digits[.fraction]e[±exponent],其中sign代表正负号,digits表示整数部分,fraction表示小数部分,exponent表示指数部分。
例如,-123.456e+2表示-12345.6,123.456e-2表示1.23456。
科学计数法用浮点数来表示,它的格式如下:[sign]mantissa[×10^exponent],其中sign代表正负号,mantissa表示尾数,exponent表示指数。
例如,-123.456×10^2表示-12345.6,123.456×10^-2表示1.23456。
科学计数法可以使用几种不同的方式来表示特别大的数字。
它的优势在于可以使用很少的字符来表示一个非常大的数值,而不会因为小数位数过长而显得复杂。
当精度要求不太高,可以使用科学计数法来减少存储空间和计算时间。
PHP中科学计数法的应用非常广泛,它可以在很多地方使用,比如:1. 在文件中读取大数时,可以使用科学计数法来保存数据,减少存储空间和计算时间。
2. 在计算数学表达式时,可以使用科学计数法来表示较大的数字,以减少计算时间。
3. 在数学计算器中,可以使用科学计数法来表示较大的数字,以减少计算时间。
4. 在处理大量数据时,可以使用科学计数法来快速处理数据,以提高效率。
5. 在数据库中,可以使用科学计数法来存储大数据,减少存储空间和计算时间。
总之,PHP科学计数法是一种非常有用的工具,它可以帮助我们有效地处理大量数据,提高效率。
计算器功能键介绍

M+是计算结果并加上已经储藏的数; M-是计算结果并用已储藏的数字减去目前的结果; MR是读取储藏的数据; MC是消除储藏数据; AC,CE归零是有一个是消除现有数据从头输入, 另一个是消除所有数据结果和运算符 .按钮功能%按百分比的形式显示乘积结果。
输入一个数,单击“*”,输入第二个数,而后单击“%” 。
比如, 50 * 25%将显示为。
也可履行带百分数的运算。
输入一个数,单击运算符(“+”、“- ”、“* ”或“/ ”),输入第二个数,单击“%”,而后单击“=” 。
比如,50 + 25%(指的是 50的 25%)= 。
1/x计算显示数字的倒数。
A–F在数值中输当选中字母。
只有在十六进制模式为开启状态时该按钮才可用。
And计算按位 AND。
逻辑运算符在履行任何按位运算时将截断数字的小数部分。
Ave计算“统计框” 对话框中显示数值的均匀值。
若要计算平均方值,请使用“Inv ” +“Ave” 。
只有先单击“Sta”,该按钮才可用。
Backspace删除目前显示数字的最后一位。
站将显示数字变换为二进制数字系统。
最大的无符号二进制CCE cosDat十进制度数dmsExpF-E梯度数值是将 64 位全都设置为 1 。
消除目前的计算。
消除显示数字。
计算显示数字的余弦。
若要计算反余弦,请使用“Inv ” +“cos” 。
若要计算双曲余弦,请使用“Hyp” +“cos” 。
若要计算反双曲余弦,请使用“Inv ” +“Hyp” +“cos” 。
cos 只好用于十进制数字系统。
在“统计框” 对话框内输入显示的数字。
只有先单击“Sta”,该按钮才可用。
将显示数字变换为十进制数字系统。
在十进制模式下将三角函数输入设置为度数。
将显示数字变换为度 - 分- 秒格式(假定显示数字是用度数表示的)。
若要将显示数字变换为用度数表示的格式(假设显示数字是用度 - 分- 秒格式表示的),请使用“Inv ” +“dms” 。
dms 只好用于十进制数字系统。
计算器分数

计算器分数在科学界,数学被认为是一门关键的学科,它可以帮助人们解决日常问题,还可以探索未知的未来。
然而,有一个概念在科学计算中可能是最重要的,那就是“分数”。
分数是在任何数学计算中都会涉及到的,因为它能够精确衡量和操作数字。
在生活中,分数经常与教材中有关,而在数学和科学计算中,分数则更为复杂,它们能够更精确的描述某种值的大小。
这也是为什么分数在科学计算中是如此重要的原因,因为它们能够精确地描述一种定义或结果。
分数可以分为两种类型,即有理数和无理数。
有理数指的是那些能够被表示成整数或有理数的数字;无理数指的是那些无法被表示成任何有理数的数字。
例如,圆周率π的值大约是3.14,但是它无法被表示成任何有理数,所以它就是一个无理数。
还有一个重要的概念就是小数,它们可以被用来表示有理数的值,比如3.14就是π的值的一种表示。
小数也可以用来表示无理数,但是即使用最大的准确度也只能表示出这个数字的一部分。
这也是为什么分数在科学计算中如此重要的原因:它们可以更精确地表示出某个值的大小,而不需要使用小数或者无理数。
此外,在实际应用中,分数也比有理数和小数更容易处理和理解,因为用户可以用简单的方法快速推导出这些值,而不需要繁琐的计算过程。
分数可以用各种方式表示,比如通常的文字格式、图形表示、计算器表示等等。
在这里,我们将关注计算器分数,即使用计算器来处理分数的方法。
现在,大多数计算器都能够处理分数,但是它们有不同的操作方法,这取决于计算器的能力和类型。
有些计算器只能处理整数的分数,而其他计算器则可以处理任意分数。
有些计算器甚至可以处理有理数和无理数。
下面简要介绍几种最常用的计算器分数。
首先,在大多数计算器上,可以使用符号“/”来表示分数,比如3/4表示三分之四,可以使用“/”来表示四分之三,也可以使用“”或“÷”来表示。
此外,计算器也可以使用其他符号,比如p表示百分比,n表示分数分母,m表示分数分子等等。
计算器有关按键说明大全

计算器有关按键说明大全一、基本按键ON 开机OFF 关机AC 总清,清除所有存储和显示数值(又: CA, All ClearC 清除所有显示和当前运算、归零(又: CLR、 Esc,英文名Clear 注:以上又有组成组合键的情况为 ON/OFF、ON/AC、ON/CCE 清除输入,清除当前输入数据中最后一个不正确的输入数据并显示“ 0”,可重新更正输入(英文名 Clear Error 或 Clear Entry ? 清除光标前一字符(又:←、 Backspace、 BS、 DEL (delete) INS 改写模式,从当前位置插入(英文名 insert REPLAY 指令状态移动方向,上下查记录,左右移动当前表达式中光标(一般此键上有成十字排列的方向标识:▲▼ ? ? SHIFT 转换,上档选择(又: 2ndF、2nd、2n(d第二功能选择, Second Function )、 ALT,按键设定为与其同色的功能ALPHA 阿尔法,字母,按键设定为与其同色的功能MODE 方式、模式,用于模式切换(不同的计算器有所不同,常用的见下表:对于数值计数法有:Norm(normal )标准计数法Fix (fixed )固定小数点Eng(engineering )工程计数法Sci (scientific )科学计数法Inv 反、倒置,用于使用其它有关按键的相反功能,多用于电子计算器。
如 ln 键变为 e x键,sin 键变为 sin -1键,lsh 键变为rsh 键等 EXP 以科学记数法输入数字,即表示以 10 为底的方幂(又: EE,英文名 Exponent说明:科学记数法:将一个数字表示成a×10 的n 次幂的形式,其中1≤|a| <10,n 表示整数,这种记数方法叫科学记数法。
如:5EXP2即5×102,就是500 F-E 科学记数法开关,显示方式转换作用:十进制浮点(Floating Point )与科学记数法(Exponent) 显示转换S? D 数值在标准形式 ( Standard )和小数形式(Decimal fraction ) 之间转换作用:分数与小数显示转换Ran# 随机数(又: RAND、 RND、Rnd#,英文名 Random, : 分隔符,用于输入方程式之间、坐标数据之间分隔用∠ 角,用于标识极坐标数据的角度数据或复数的虚数二、基础运算0、00、1、2、3、4、5、6、7、8、9 数字A、 B、C、D、 E、F 十六进制数字或存储单元. 十进制小数点+- ×( * )÷( / )四则运算符注:-有的作为负号=等号+/ -正负转换,负号(又:、± (-)()括号,(称为始括号或左括号,)称为末括号或右括号注:=前的)键操作可省略a 、 d/c 分数输入或将计算结果在小数值和分数值之间变换注:一般结果为小数,如果其绝对值大于或等于 1,按一次d/c 以假分数形式显示,再按一次 d/c 则以带分数形式显示;如果其绝对值小于 1,则两次均以真分数形式显示 % 百分号,关于百分比的计算方法见下表注:以上实物计算器不按等号,不同的计算器定义不同,按其实际运算规则。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
齐鲁工业大学面向对象程序设计课程设计报告学号:************姓名:***班级:计科12-1班课程设计题目:有符号大整数计算器成绩:一:设计目的与要求对数值很大、精度很高的数进行高精度大整数计算是一类十分常见的问题。
但由于C++语言中数据长度和范围受数据类型的限制,普通数学计算很难实现此类问题,为尝试解决这个问题,专门设计一个C++语言程序用于有符号大整数的计算。
二:设计内容分析1.功能分析:2.函数设计:A.运算辅助函数(1)检测用户输入运算符函数:Check_Oper()函数原型:char Check_Oper(string &str,string &num_1,string &num_2);功能:检测用户输入的运算符,并将char类型的运算符作为函数的返回值,若用户输入有误则提示用户。
(2)反转字符串函数:Reverse_String()函数原型:string Reverse_String(string &str);功能:传入string类型对象的引用,将其中保存的字符串全部反转后作为函数的返回值返回。
(3)字符串ASCII码减48位函数:SUB_ASC()函数原型:string SUB_ASC(string &str);功能:将string类型对象中字符串的所有元素的ASCII码减48。
(4)字符串ASCII码加48位函数:ADD_ASC()功能:将string类型对象中字符串的所有元素的ASCII码加48。
(5)获取最大数函数:GET_MAX()函数原型:string GET_MAX(string &num1,string &num2);功能:将两个以string类型存放的大整数传入函数,返回值最大的整数的string对象。
B.数据运算(1)加法运算:addition()函数原型:string addition(string &num1,string &num2);实现步骤:依次将两个字符串的每一位元素的ASCII码进行加法运算并存入结果中,对满十的结果进行进位,然后对该位进行对十取余存入当前元素中。
(2)减法运算:subduction()函数原型:string subduction(string &num1,string &num2);实现步骤:依次将两个字符串的每一位元素的ASCII码进行减法运算并存入结果中,对负值的结果进行借位,然后对该位进行加十运算存入当前元素中。
(3)乘法运算:multiplication()函数原型:string multiplication(string &num1,string &num2);实现步骤:依次将一字符串中的所有元素的ASCII码乘以另一个字符串中的所有元素并相加后存入结果中,对每一个大于10的ASCII码元素进行进位操作。
(4)除法运算:division()函数原型:string division(string &num1,string &num2);实现步骤:将未经反转的字符串传入,循环利用比较和减法,若余数大于除数,则进行减法调用。
(5)阶乘运算:factorial()函数原型:string factorial(string &num);实现步骤:依次对1至N之间的所有整数进行乘法运算。
三:实现步骤#include <iostream>#include <string>#include <conio.h>#include <stdio.h>#include <stdlib.h>#include <windows.h>using namespace std;class Operation{public:char Check_Oper(string &str,string &num_1,string &num_2); //检测运算符string addition(string &num1,string &num2); //加法运算string subduction(string &num1,string &num2); //减法运算string multiplication(string &num1,string &num2); //乘法运算string division(string &num1,string &num2); //除法运算string factorial(string &num); //阶乘运算private:string SUB_ASC(string &str); //字符串ASCII码减48位string ADD_ASC(string &str); //字符串ASCII码加48位string GET_MAX(string &num1,string &num2); //获取两个数中的最大值};string Operation::addition(string &num1,string &num2){unsigned short a=0,b=0;string result;string num_1(num1);string num_2(num2);string::size_type i=0,j=0;Reverse_String(num_1);Reverse_String(num_2);SUB_ASC(num_1);SUB_ASC(num_2);for(i=0; i!=num_1.size(); i++) a+=num_1[i];for(j=0; j!=num_2.size(); j++) b+=num_2[j];if(a!=0 || b!=0) goto skip;result.insert(result.begin(),'0');return result;skip:i=j=0;while(i!=num_1.size() || j!=num_2.size()){if(i!=num_1.size() && j!=num_2.size()) result.insert(result.end(),num_1[i]+num_2[j]);else if(i!=num_1.size()) result.insert(result.end(),num_1[i]);else if(j!=num_2.size()) result.insert(result.end(),num_2[j]);i==num_1.size()?i:i++;j==num_2.size()?j:j++;}for(i=0; i!=result.size(); i++)if(result[i]>9){result[i]%=10;if(i+1==result.size()) result.insert(result.end(),0);result[i+1]+=1;}ADD_ASC(result);Reverse_String(result);while(1){if(*result.begin()=='0') result.erase(result.begin());else break;}}string Operation::subduction(string &num1,string &num2){short k=0;string result;string::size_type i=0,j=0;string num_1(num1);string num_2(num2);if(GET_MAX(num_1,num_2)==num_2){k=1;num_2.swap(num_1); //交换对象数据}Reverse_String(num_1);Reverse_String(num_2);SUB_ASC(num_1);SUB_ASC(num_2);i=j=0;while(i!=num_1.size() || j!=num_2.size()){if(i!=num_1.size() && j!=num_2.size()) result.insert(result.end(),num_1[i]-num_2[j]);else if(i!=num_1.size()) result.insert(result.end(),num_1[i]);else if(j!=num_2.size()) result.insert(result.end(),num_2[j]);i==num_1.size()?i:i++;j==num_2.size()?j:j++;}for(i=0; i!=result.size(); i++)if(result[i]<0){result[i]=10+result[i];result[i+1]-=1;}ADD_ASC(result);Reverse_String(result);while(1){if(*result.begin()=='0') result.erase(result.begin());else break;}if(k){if(result.empty())result.insert(result.end(),'0');result.insert(result.begin(),'-');}return result;}string Operation::multiplication(string &num1,string &num2){string result,temp;string num_1(num1);string num_2(num2);string::size_type i=0,j=0,m=0;short k=1;char tmp=NULL;Reverse_String(num_1);Reverse_String(num_2);SUB_ASC(num_1);SUB_ASC(num_2);for(i=0; i!=num_1.size(); i++) result.insert(result.end(),num_2[0]*num_1[i]);for(m=0; m!=result.size(); m++)if(result[m]>9){tmp=result[m];result[m]%=10;if(m+1==result.size()) result.insert(result.end(),0);result[m+1]+=tmp/10;}while(j!=num_2.size()-1){j++;if(j==num_2.size()) break;for(i=0; i!=num_1.size(); i++) temp.insert(temp.end(),num_2[j]*num_1[i]);temp.insert(temp.begin(),k,0);for(m=0; m<temp.size(); m++) temp[m]+=result[m];for(m=0; m<temp.size(); m++)if(temp[m]>9){tmp=temp[m];temp[m]%=10;if(m+1==temp.size()) temp.insert(temp.end(),0);temp[m+1]+=tmp/10;}result.assign(temp);ADD_ASC(result);SUB_ASC(result);temp.erase(temp.begin(),temp.end());}Reverse_String(result);ADD_ASC(result);return result;}string Operation::division(string &num1,string &num2){string result;string MAX;string remainder;string num1_tmp;string num_1(num1);string num_2(num2);string step(1,'1');string temp1,temp2;string::iterator iter=NULL;string::size_type i=0;while(*num_2.begin()=='0') num_2.erase(num_2.begin());if(num_2.empty()){result="除数不可以为零!";return result;}num_1.insert(num_1.end(),100,'0');iter=num_1.begin()+num_2.size();num1_tmp.assign(num_1.begin(),iter);iter--;again:for(step[0]='1'; 1; step[0]++){MAX.assign(GET_MAX(multiplication(num_2,step),num1_tmp));if(step[0]=='9' && num1_tmp==MAX) goto skip;if(MAX!=num1_tmp){step[0]--;skip:temp2.assign(subduction(num1_tmp,multiplication(num_2,step)));while(1)if(temp2[0]=='0') temp2.erase(temp2.begin());else break;result+=step;iter++;if(iter==num_1.end()){i=result.size()-100;result.insert(i,1,'.');while(*result.begin()=='0' && *(result.begin()+1)!='.')result.erase(result.begin());while(*(result.end()-1)=='0' && *(result.end()-2)!='.') result.erase(result.end()-1);break;}num1_tmp.assign(temp2);num1_tmp.insert(num1_tmp.end(),*iter);goto again;}}return result;}string Operation::factorial(string &num){string result(num);string step(1,'1');string _num(num);// if(num.size()<=1)// if(num[0]=='1' || num[0]=='0')// return step;// cout <<num<<endl;// result.assign(multiplication(factorial(subduction(num,step)),num));for(_num.assign(subduction(_num,step)); _num.size()==1?(_num[0]=='1' || _num[0]=='0'?0:1):1; _num.assign(subduction(_num,step)))result.assign(multiplication(result,_num));return result;}char Operation::Check_Oper(string &str,string &num_1,string &num_2){char ch=NULL;short k=1;string::size_type i;if(str[str.size()-1]=='!')if(str[0]>=48 && str[0]<=57)return '!';elsereturn NULL;if(str[0]!='-') i=0;else if(str[0]=='-'){num_1.insert(num_1.end(),'-');i=1;else if(str[0]=='+') i=1;else return NULL;for(; i<str.size(); i++){if(str[i]>=48 && str[i]<=57){if(k) num_1.insert(num_1.end(),str[i]);elsenum_2.insert(num_2.end(),str[i]);}else{if(ch!=NULL) return NULL;switch(str[i]){case '+':ch='+';break;case '-':ch='-';break;case '*':ch='*';break;case '/':ch ='/';break;default:return NULL;}k=0;}}return ch;}string Operation::Reverse_String(string &str){string::size_type i,j=str.size()-1,length=str.size()/2;char tmp=NULL;for(i=0; i<length; i++,j--){tmp=str[i];str[i]=str[j];str[j]=tmp;}}string Operation::SUB_ASC(string &str){string::size_type i;for(i=0; i<str.size(); i++) str[i]-=48;return str;}string Operation::ADD_ASC(string &str){string::size_type i;for(i=0; i<str.size(); i++) str[i]+=48;return str;}string Operation::GET_MAX(string &num1,string &num2){string num_1(num1);string num_2(num2);string::size_type i;while(num_1[0]=='0' || num_2[0]=='0'){if(num_1[0]=='0') num_1.erase(num_1.begin());if(num_2[0]=='0') num_2.erase(num_2.begin());}if(num_1.size()>num_2.size()) return num_1;else if(num_1.size()<num_2.size()) return num_2;else{for(i=0; i!=num_1.size(); i++)if(num_1[i]>num_2[i]) return num_1;else if(num_1[i]<num_2[i]) return num_2;}return num_1;}int Console(){system("cls");SetConsoleTitle("有符号大整型数字计算器——By:计科12-1班魏子楠");cout<<"==============================================================================="<<endl;cout <<"\t\t\t有符号大整型数字计算器"<<endl;cout <<"本程序可进行:\n1.加法运算\t2.减法运算\t3.乘法运算\t4.除法运算\t5.阶乘运算"<<endl;<<"==============================================================================="<<endl;return 1;}int main(int argc,char *argv[]){again:char ch;Operation oper;string *_str=new string;string *_num1=new string;string *_num2=new string;string *_result=new string;string &str=*_str;string &num1=*_num1;string &num2=*_num2;string &result=*_result;Console();fflush(stdin);cout <<"请输入运算式:"<<endl;cin >>str;if((ch=oper.Check_Oper(str,num1,num2))==NULL) cout <<"输入有误!"<<endl;if(num1[0]=='-')switch(ch){case '+':num1.erase(num1.begin());result.assign(oper.subduction(num2,num1));break;case '-':num1.erase(num1.begin());result.assign(oper.addition(num1,num2));result.insert(result.begin(),'-');break;case '*':num1.erase(num1.begin());result.assign(oper.multiplication(num1,num2));result.insert(result.begin(),'-');break;case '/':num1.erase(num1.begin());result.assign(oper.division(num1,num2));result.insert(result.begin(),'-');break;default:cout <<"数据出错!"<<endl;return -1;}elseswitch(ch){case '+':result.assign(oper.addition(num1,num2));break;case '-':result.assign(oper.subduction(num1,num2));break;case '*':result.assign(oper.multiplication(num1,num2));break;case '/':result.assign(oper.division(num1,num2));break;case '!':str.erase(str.end()-1);result.assign(oper.factorial(str));break;default:cout <<"数据出错!"<<endl;return -1;}cout <<"计算结果:"<<endl<<result<<endl;delete _str;delete _result;delete _num2;delete _num1;getch();goto again;return 1;}四:测试和结果分析程序控制台:测试加法运算:测试减法运算:测试乘法运算:测试除法运算(保留小数点后100位):测试阶乘运算:五:实验体会与思考这次实验达到了预期的目标,实现了有符号的大整数运算,但是还有很多不足的地方,比如算法并不是最优的,在进行大整数阶乘运算时耗时较长,此外代码的编写也有些混乱,有些地方设计的不够清晰,以后应注意代码的规范书写和模块化的程序设计。