数据结构 计算器求大数.docx

上传人:b****6 文档编号:13719702 上传时间:2023-06-16 格式:DOCX 页数:15 大小:49.85KB
下载 相关 举报
数据结构 计算器求大数.docx_第1页
第1页 / 共15页
数据结构 计算器求大数.docx_第2页
第2页 / 共15页
数据结构 计算器求大数.docx_第3页
第3页 / 共15页
数据结构 计算器求大数.docx_第4页
第4页 / 共15页
数据结构 计算器求大数.docx_第5页
第5页 / 共15页
数据结构 计算器求大数.docx_第6页
第6页 / 共15页
数据结构 计算器求大数.docx_第7页
第7页 / 共15页
数据结构 计算器求大数.docx_第8页
第8页 / 共15页
数据结构 计算器求大数.docx_第9页
第9页 / 共15页
数据结构 计算器求大数.docx_第10页
第10页 / 共15页
数据结构 计算器求大数.docx_第11页
第11页 / 共15页
数据结构 计算器求大数.docx_第12页
第12页 / 共15页
数据结构 计算器求大数.docx_第13页
第13页 / 共15页
数据结构 计算器求大数.docx_第14页
第14页 / 共15页
数据结构 计算器求大数.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数据结构 计算器求大数.docx

《数据结构 计算器求大数.docx》由会员分享,可在线阅读,更多相关《数据结构 计算器求大数.docx(15页珍藏版)》请在冰点文库上搜索。

数据结构 计算器求大数.docx

数据结构计算器求大数

《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;i

v1[i]=b1[L-1-i]-'0';

L=strlen(b2);

for(i=0;i

v2[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();

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2