数据结构 计算器求大数.docx
《数据结构 计算器求大数.docx》由会员分享,可在线阅读,更多相关《数据结构 计算器求大数.docx(15页珍藏版)》请在冰点文库上搜索。
![数据结构 计算器求大数.docx](https://file1.bingdoc.com/fileroot1/2023-6/16/5e321c72-1f5c-44a3-978c-66a345820f7d/5e321c72-1f5c-44a3-978c-66a345820f7d1.gif)
数据结构计算器求大数
《C++程序设计》课程设计说明书
计算器求大数
院部:
计算机与信息科学学院
学生姓名:
专业:
软件工程
班级:
1401
完成时间:
2015年6月
1.设计概要
1.1设计背景
利用数组存储,根据需要改变大小。
转化乘除法的思想,将乘法转化为加法,将除法转化为减法,减少程序计算的难度。
1.2数据结构设计
1.乘法用逐位相乘由各位到高位一次进行,然后初步确定计算结果的长度s1[i]=c1[len1-i-1]-'0'将字符串转化为整型,并反着存放。
2.除法转化为减法的思想来计算,大大降低计算设计的难度,利用数来存储。
并可以根据计算位数要求设计数组大小以满足需求。
3.通过主函数来实现函数的调用。
2.1需求分析
在调查与科研实验中经常需要计算位数相对较大的加减乘除法,但是计算机本身提供的数据类型无法保存几百位甚至上千位的。
所以针对超过手机与计算器计算位数的四则运算,设计出能实现长整数运算的程序。
2.1实现功能
大数加法:
输入两个位数较大的数,实现加法计算。
大数减法:
输入两个位数较大的数,实现减法计算,但不能计算结果为负数的数。
大数乘法:
输入两个位数较大的数,实现乘法计算。
大数除法:
输入两个位数较大的数,实现除法计算,计算结果只保留整数。
进制转换:
指定输入什么进制的数,可将其转变成任意进制数
4.测试结果
图4-1主菜单
图4-2大数加法
图4-3大数除法
图4-4进制转换
5.实验总结
5.1改进思想
1.减法不能用小数减去大数,即不能有负数结果。
2.除法不能保留小数点后的数字,精确度还有待提高。
3.程序的界面也还有待改进,可以进一步将界面进行美化
5.2经验和体会
大数的四则运算虽然不难,但是要打破常规,将乘法与除法换一种思想来计算,构思方面有很大的挑战。
在这次试验中我们认识到了对于特别长的数的计算,只能化整为零,先求局部的结果,然后将各部分的结果综合起来,得到最终的结果。
比如加法就是从最低位开始计算,判断进位后再向高位计算。
但是乘除法虽然进行了转换,但是数字如果太大的话,进行加减法的次数也是很庞大的。
本程序是分工完成的,所以我们也充分认识到了团队协作的重要性,通过一起的讨论与分工,我们能得出解决问题的最好办法,各抒己见,在争论中互相成长。
此外,这次的课程设计进一步加强了我们进行编程,调试,处理问题的能力,加深了我们对算法及数据结构的认识,对于程序的一些基本结构也更加地熟悉,课本知识也能够更加熟练地运用。
。
同时我们也意识到,开发程序的早期计划要做的充分,以免出现程序完成后发现不足而带来的修改麻烦。
虽然这只是一个小小的程序,但对我们之后的影响确实很大的。
参考文献
[⒈]谭浩强.C++程序设计(第四版).清华大学出版社,2010年6月
[⒉]谭浩强.C语言程序设计(第四版).清华大学出版社,2010年6月
[⒊]崔进平等.数据结构(C语言版).北京:
中国铁道出版社,2008年11月
[⒋]StephenPrata.CPrimerPlus中文版(第五版).人民邮电出版社,2005年2月
附录
源程序
#include
usingnamespacestd;
#include
#include
#include
#include
#include
#defineNUM1000
typedefstructSTACKNOTE
{
chardata;
STACKNOTE*next;
}LinkStack,*STACK;
intInit_stack();
intEmpty_Stack();
intStack_conversion();
intPop_Stack();
intPush_Stack_Elem();
voidmenu();
voidnumzero(ints[]);
voidstrzero(chars[]);
voidadd(chara1[],chara2[]);
voidjian(charb1[],charb2[]);
voidcheng(charc1[],charc2[]);
voidchu(chard1[],chard2[]);
voidmenu()
{
system("cls");
intcount=0;
printf("\n\n\t**********计算器**********\n");
printf("\t1.大数加法\n");
printf("\t2.大数减法\n");
printf("\t3.大数乘法\n");
printf("\t4.大数除法\n");
printf("\t5.进制转换\n");
printf("\t**************************\n\n");
intnum;
voidjian(charb1[],charb2[])
{
intv1[NUM];
intv2[NUM];
intv3[NUM],L,i,z;
numzero(v1);
numzero(v2);
numzero(v3);
L=strlen(b1);
for(i=0;iv1[i]=b1[L-1-i]-'0';
L=strlen(b2);
for(i=0;iv2[i]=b2[L-1-i]-'0';
for(i=0;i{
v3[i]=v1[i]-v2[i];
}
/*
for(i=0;i<9;i++)
{
cout<}
cout<*/
intjw=0;
for(i=0;i{
if(v3[i]<0)
{
v3[i]=10-abs(v3[i]);
v3[i+1]-=1;
}
}
z=0;
for(i=NUM-1;i>=0;i--)
{
if(v3[i]==-1&&z==0)
{
printf("-");
v3[i]=abs(v3[i]);
break;
}
if(v3[i]!
=0&&v3[i]!
=-1)
{
z=1;
}
}
z=0;
printf("\n计算结果为:
");
for(i=NUM-1;i>=0;i--)
{
if(z==0)
{
if(v3[i]!
=0)
{
printf("%d",v3[i]);
z=1;
}
}
else
{
printf("%d",v3[i]);
}
}
if(z==0)
printf("0");
printf("\n");
printf("请按任意键返回\n");
getchar();
getchar();
getchar();
menu();
}
voidcheng(charc1[],charc2[])
{
ints1[NUM],s2[NUM],ss[NUM];//s1,s2:
两个乘数;s:
乘积的结果
inti,j,k,c;
intlen1,len2,len;
len1=strlen(c1);
len2=strlen(c2);
len=len1+len2;//初步确定乘积的长度
for(i=len1-1;i>=0;i--)
{
s1[i]=c1[len1-i-1]-'0';//将字符串转化为整型,并反着存放
}
for(i=len2-1;i>=0;i--)
{
s2[i]=c2[len2-i-1]-'0';
}
numzero(ss);
for(i=0;i<=len1-1;i++)
for(j=0;j<=len2-1;j++)
ss[i+j]=ss[i+j]+s1[i]*s2[j];//逐位相乘
for(i=0,c=0;i<=len-1;i++)//处理进位
{
k=ss[i]+c;
ss[i]=k%10;
c=k/10;
}
for(i=len-1;i>=0;i--)
if(ss[i]!
=0)
break;//处理多余的零
len=i+1;
charline[NUM];//注意只有指针才可以返回去,不能定义成数组
if(len==0)
{
line[0]=0+'0';
line[1]='\0';//字符串的结束标志
}
else
{
for(i=0;i<=len-1;i++)
line[i]=ss[len-i-1]+'0';
line[len]='\0';//字符串的结束标志
}
printf("\n计算结果为:
");
cout<printf("\n");
getchar();
getchar();
menu();
}
intStack_conversion()
{
system("cls");
charstr[21];
intcount=0;
intNumbers;
inti;
printf("请输入您要输入什么进制的数\n");
cin>>Numbers;
printf("请输入您要转化的数\n");
cin>>str;
STACKConversion_Stack;
Init_stack(Conversion_Stack);
if(!
Empty_Stack(Conversion_Stack))
{
return0;
}
for(i=0;i<=strlen(str)-1;i++)
{
charTemp_Conversion_number=str[i];
Push_Stack_Elem(Conversion_Stack,Temp_Conversion_number);
count++;
}
longlongRes_Number=0;
charTempNum;
intk;
for(i=0,k=1;i{
Pop_Stack(Conversion_Stack,TempNum);
if(TempNum>='0'&&TempNum<='9')
{
Res_Number+=(k*(TempNum-'0'));
}
if(TempNum>='a'&&TempNum<='z')
{
Res_Number+=(k*(TempNum-'a'+10));
}
if(TempNum>='A'&&TempNum<='Z')
{
Res_Number+=(k*(TempNum-'A'+10));
}
k*=Numbers;
}
char*tempstr="0123456789ABCDEF";
intj;
printf("\n请问您要把%s转化成什么进制的数\n",str);
cin>>j;
chars[20];
intcounts=0;
while(Res_Number)
{
s[counts++]=tempstr[Res_Number%j];
Res_Number/=j;
}
printf("\n经过计算,%d进制的%s转化为%d进制的结果为:
\n",Numbers,str,j);
for(i=counts-1;i>=0;i--)
cout<
printf("\n");
printf("请按任意键返回\n");
getchar();
getchar();
getchar();
menu();
}