数据结构课程设计长整数四则运算汇总Word格式文档下载.docx
《数据结构课程设计长整数四则运算汇总Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计长整数四则运算汇总Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计长整数四则运算汇总Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/27/35e14c3c-a6dd-4132-a0a8-f448e44ec8f0/35e14c3c-a6dd-4132-a0a8-f448e44ec8f01.gif)
c)
初始条件:
a,b,c都已存在
操作结果:
c等于a和b的和。
nep(&
a)
a已存在。
a变为输入参数的相反数。
printlong(&
a)
初始条件:
按四位一组,分隔符为"
"
的格式,在屏幕上输出a。
ston(&
S,&
a)初始条件:
把字符串形式的长数字赋给a。
}ADTOrderedList
2.本程序包含两个模块:
1)主程序模块:
Voidmain(){
选择操作:
1:
帮助。
2:
加法。
3:
减法。
4:
乘法。
5:
除法。
6:
退出。
打印结果;
}
三、详细设计
1.元素类型,结点类型,指针类型
#defineNULL0
#include<
stdio.h>
stdlib.h>
conio.h>
typedefstructlongnode{/*每个节点的结构*/
intnum;
/*数字*/
structlongnode*low1;
/*指向低一位节点*/
structlongnode*high1;
/*指向高一位节点*/
}longnode;
typedefstructxlong{/*每个长整数的结构*/
longnode*High;
/*每个长整数的最高节点*/
longnode*Low;
/*每个长整数的最低节点*/
intdigit4;
/*每个长整数的总位数(不包括高位的0)/4*/
}*xlong;
intinit(xlong*a,intdigit4){
intI;
/*.init.*/
longnode*j;
(*a)=(xlong)malloc(sizeof(structxlong));
/*为a的头结构申请空间,并赋初始值*/
(*a)>
High=NULL;
(*a)->
Low=NULL;
(*a)->
digit4=0;
for(i=0;
i<
digit4;
i++){/*申请digit4个节点,初始化*/
j=(longnode*)malloc(sizeof(longnode));
j->
num=0;
high1=NULL;
j->
low1=(*a)->
High;
if((*a)->
High)(*a)->
High->
high1=j;
else
Low=j;
High=j;
digit4++;
}
intpass(xlonga,xlongb,xlongc){
intcf=0;
/*两个数字的相加*/
longnode*a1=a->
Low,*b1=b->
Low,*c1=c->
Low;
while(a1){c1->
num=a1->
num+b1->
num+cf;
if(c1->
num>
9999){
cf=1;
/*如果产生进位(借位)*/
c1->
num-=10000;
}else{cf=0;
}
a1=a1->
high1;
b1=b1->
c1=c1->
returncf;
/*最高位的进位(借位)*/
intpassa(xlonga,xlongb,xlongc){
/*两个数字的相减*/
num-b1->
num-cf;
9999){cf=1;
/*如果产生进位(借位)*/
/*最高位的进位(借位)*/
intpassb(xlonga,xlongb,xlongc){
intcf=0;
/*两个数字的相乘*/
longnode
*a1=a->
num*b1->
num*cf;
9999){cf=1;
/*如果产生进位(借位)*/
c1->
num=10000;
/*最高位的进位(借位)*/
intpassc(xlonga,xlongb,xlongc){
intcf=0;
/*两个数字的相除*/
while(a1){c1->
num/b1->
num/cf;
}else{cf=0;
}}
}
returncf;
nep(xlonga){/*求a的相反数*/
intcf=1;
/*因为求相反数是取反加一,所以这里cf=1;
*/
while(a1)
{a1->
num=9999-(a1->
num)+cf;
if(a1->
9999){a1->
else{cf=0;
}a1=a1->
return;
printlong(xlonga){
longnode*i=a->
/*打印长整数a*/
if(i->
=5000){
printf("
-"
);
/*最高位(bit)=1表示负数,即用补码表示*/
nep(a);
/*求反打印其绝对值*/
}while(i&
&
i->
num==0)i=i->
low1;
/*跳过最位的0*/
if(i){printf("
%d"
i->
num);
i=i->
if(i)printf(“,”);
}elseprintf(“0”);
/*a=0打0*/
while(i){printf("
%04d"
low1)
i=i->
intston(charin[],xlongout){/*把字符串转化为数字赋给a*/
intbit,i,jishu=1,num0=0;
longnode*j=out->
i=strlen(in)-1;
while(i>
=0&
j){/*循环每一个字节*/
bit=in[i]-‘0’;
/*把字符形式的值赋给整数形式的bit*/
if(bit>
bit<
=9){num0+=jishu*bit;
/*加进num0*/
jishu*=10;
/*基数自乘10*/}
if(jishu>
1&
(jishu>
=10000||bit<
0||bit>
9)){/*数字以外的字符*/
j->
num=num0;
j=j->
/*存入一个节点*/
num0=0;
jishu=1;
i--;
if(num0)
{j->
}/*把最后一个没存入节点的数存入节点*/
for(;
j;
high1)j->
/*最位不足补0*/
if(out->
=5000)
return1;
/*如果最高位是1,返回1表示出*/
if(in[0]=='
-'
)nep(out);
/*如果最后一个字符是'
-'
则取反*/return0;
intadd(){char*a1,*b1;
/*加*/
intdigit4,cf=0;
xlonga,b,c;
do{printf("
Howmuchdigitsdoyouneed?
"
/*输入最多位数*/
scanf("
&
digit4);
}while(digit4<
=0);
a1=(char*)malloc(digit4+1);
b1=(char*)malloc(digit4+1);
digit4=digit4/4+1;
init(&
a,digit4);
init(&
b,digit4);
c,digit4);
/*初始化a,b,c*/
do{cf=0;
Enter2number:
\n"
%s"
a1);
printf("
+\n"
b1);
cf|=ston(a1,a);
cf|=ston(b1,b);
}while(cf);
/*输入被加数和加数,如果转换出错,则重输*/
pass(a,b,c);
/*执行相加运算*/
printlong(a);
+"
/*打印结果*/
printlong(b);
="
printlong(c);
bioskey(0);
intsubtract()/*减*/
{
char*a1,*b1;
xlonga,b,c;
do{printf("
/*输入最多位*/
}while(digit4<
Enter2number:
/*输入被减数和减数,如果转换出错,则重输*/
passa(a,b,c);
/*执行相减运算*/
printlong(b);
intmultiply()/*乘*/
{char*a1,*b1;
/*输入最多位数*/
scanf("
a1=(char*)malloc(digit4+1);
digit4=digit4/4+1;
do{cf=0;
*\n"
cf|=ston(b1,b);
}while(cf);
/*输入被乘数和乘数,如果转换出错,则重输*/
passb(a,b,c);
/*执行相乘运算*/
printf(“*”);
/*打印结果*/
printlong(c);
intdivision()/*除*/
/*输入最多位数*/
/\n"
cf|=ston(a1,a);
/*输入被除数和除数,如果转换出错,则重输*/
passc(a,b,c);
/*执行相除运算*/
/"
2.主函数代码
voidmain()/*main*/
{intc;
clrscr();
textcolor(BLUE);
***********************************************\n"
*********WelcometoThunderstudio!
************\n"
*********本程序实现长整数四则运算**************\n"
one:
1:
------HELP\n"
2:
------ADD\n"
3:
------SUBTRACT\n"
4:
------MULTIPLY\n"
5:
------DiVISION\n"
6:
------EXIT\n"
;
){c=getch();
switch(atoi(&
c)){
case1:
gotoone;
break;
case2:
add();
case3:
subtract();
case4:
multiply();
case5:
division();
case6:
printf("
\n------------------------------------------------------------\n"
Thankscw'
swork!
!
default:
textcolor(4);
Sorrypleaseinputrightnumber!
break;
}
四、调试分析
1.由于对基本要求看得不仔细,一开始使用的形式是数组,并非链表,导致空间开销大.
2.本程序的模块划分比较合理,且尽可能将指针的操作封装在结构体中,对于一个长整数只需一个指针便可访问其所有信息,所以数据结构清晰.
3.算法的时空分析1)本程序的计算量不是很大,所以时间复杂度极低.
2)每个长整数的位数可能不同,考虑到根据位数调整空间比较麻烦,而且容易出错,所以对每个长整数都是用同样大小的空间储存的.
3)由于计算完毕,显示结果后程序即结束,所以无须释放空间.
五、用户手册
1.本程序的运行环境为DOS操作系统,执行文件为:
j01242_5.EXE。
2.进入程序有菜单提示,选择需要的操作进入程序。
3.进入程序后屏幕提示“Howmuchdigitsdoyouneed?
”用户输入两个数中最多的位数.如0则输1,12则输入2,依此类推.负号不必考虑在内.
4.接着屏幕提示“Enter2number:
”,用户应输入一个数,按回车,再输入一个数,再按回车.
5.接着屏幕即打印出计算结果.
六、测试结果
首先进入菜单选择:
如键入2<
回车>
(1)键入1<
0<
输出“0”
(2)键入8<
-2345,6789<
-7654,3211<
输出“-1,000,000”
(3)键入13<
-9999,9999<
1,0000,0000,0000<
输出“9999,0000,0001”
(4)键入9<
1,0001,0001<
-1,0001,0001<
输出“0”
(5)键入9<
1"