j=(longnode*)malloc(sizeof(longnode));
j->num=0;j->high1=NULL;j->low1=(*a)->High;
if((*a)->High)(*a)->High->high1=j;
else
(*a)->Low=j;(*a)->High=j;(*a)->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->high1;c1=c1->high1;}
returncf;/*最高位的进位(借位)*/
}
intpassa(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->high1;c1=c1->high1;
}
returncf;/*最高位的进位(借位)*/
}
intpassb(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->high1;c1=c1->high1;}
returncf;/*最高位的进位(借位)*/
}
intpassc(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->high1;c1=c1->high1;}
returncf;/*最高位的进位(借位)*/
}
nep(xlonga){/*求a的相反数*/
intcf=1;/*因为求相反数是取反加一,所以这里cf=1;*/
longnode*a1=a->Low;
while(a1)
{a1->num=9999-(a1->num)+cf;
if(a1->num>9999){a1->num=10000;}
else{cf=0;}a1=a1->high1;
}
return;
}
printlong(xlonga){
longnode*i=a->High;/*打印长整数a*/
if(i->num>=5000){
printf("-");/*最高位(bit)=1表示负数,即用补码表示*/
nep(a);/*求反打印其绝对值*/
}while(i&&i->num==0)i=i->low1;/*跳过最位的0*/
if(i){printf("%d",i->num);i=i->low1;
if(i)printf(“,”);
}elseprintf(“0”);/*a=0打0*/
while(i){printf("%04d",i->num);
if(i->low1)
printf(",");
i=i->low1;}}
intston(charin[],xlongout){/*把字符串转化为数字赋给a*/
intbit,i,jishu=1,num0=0;
longnode*j=out->Low;
i=strlen(in)-1;while(i>=0&&j){/*循环每一个字节*/
bit=in[i]-‘0’;/*把字符形式的值赋给整数形式的bit*/
if(bit>=0&&bit<=9){num0+=jishu*bit;/*加进num0*/
jishu*=10;/*基数自乘10*/}
if(jishu>1&&(jishu>=10000||bit<0||bit>9)){/*数字以外的字符*/
j->num=num0;
j=j->high1;/*存入一个节点*/
num0=0;
jishu=1;
}
i--;
}
if(num0)
{j->num=num0;j=j->high1;}/*把最后一个没存入节点的数存入节点*/
for(;j;j=j->high1)j->num=0;/*最位不足补0*/
if(out->High->num>=5000)
return1;/*如果最高位是1,返回1表示出*/
if(in[0]=='-')nep(out);/*如果最后一个字符是'-'则取反*/return0;}
intadd(){char*a1,*b1;/*加*/
intdigit4,cf=0;
xlonga,b,c;
do{printf("Howmuchdigitsdoyouneed?
");/*输入最多位数*/
scanf("%d",&digit4);
}while(digit4<=0);
a1=(char*)malloc(digit4+1);
b1=(char*)malloc(digit4+1);
digit4=digit4/4+1;
init(&a,digit4);
init(&b,digit4);
init(&c,digit4);/*初始化a,b,c*/
do{cf=0;printf("Enter2number:
\n");
scanf("%s",a1);printf("+\n");
scanf("%s",b1);cf|=ston(a1,a);
cf|=ston(b1,b);
}while(cf);/*输入被加数和加数,如果转换出错,则重输*/
pass(a,b,c);/*执行相加运算*/
printlong(a);printf("+");/*打印结果*/
printlong(b);printf("=");
printlong(c);printf("\n");
printf("\n");bioskey(0);}
intsubtract()/*减*/
{
char*a1,*b1;
intdigit4,cf=0;
xlonga,b,c;
do{printf("Howmuchdigitsdoyouneed?
");/*输入最多位*/
scanf("%d",&digit4);
}while(digit4<=0);
a1=(char*)malloc(digit4+1);
b1=(char*)malloc(digit4+1);
digit4=digit4/4+1;
init(&a,digit4);
init(&b,digit4);
init(&c,digit4);/*初始化a,b,c*/
do{cf=0;printf("Enter2number:
\n");
scanf("%s",a1);
printf("\n");
scanf("%s",b1);
cf|=ston(a1,a);
cf|=ston(b1,b);
}while(cf);/*输入被减数和减数,如果转换出错,则重输*/
passa(a,b,c);/*执行相减运算*/
printlong(a);printf("-");/*打印结果*/
printlong(b);printf("=");
printlong(c);printf("\n");
printf("\n");bioskey(0);
}
intmultiply()/*乘*/
{char*a1,*b1;
intdigit4,cf=0;
xlonga,b,c;
do{printf("Howmuchdigitsdoyouneed?
");/*输入最多位数*/
scanf("%d",&digit4);
}while(digit4<=0);
a1=(char*)malloc(digit4+1);b1=(char*)malloc(digit4+1);
digit4=digit4/4+1;
init(&a,digit4);
init(&b,digit4);
init(&c,digit4);/*初始化a,b,c*/
do{cf=0;
printf("Enter2number:
\n");
scanf("%s",a1);printf("*\n");
scanf("%s",b1);
cf|=ston(a1,a);
cf|=ston(b1,b);
}while(cf);/*输入被乘数和乘数,如果转换出错,则重输*/
passb(a,b,c);/*执行相乘运算*/
printlong(a);printf(“*”);/*打印结果*/
printlong(b);printf("=");
printlong(c);printf("\n");
printf("\n");bioskey(0);}
intdivision()/*除*/
{char*a1,*b1;
intdigit4,cf=0;
xlonga,b,c;
do{printf("Howmuchdigitsdoyouneed?
");/*输入最多位数*/
scanf("%d",&digit4);
}while(digit4<=0);
a1=(char*)malloc(digit4+1);
b1=(char*)malloc(digit4+1);
digit4=digit4/4+1;
init(&a,digit4);
init(&b,digit4);
init(&c,digit4);/*初始化a,b,c*/
do{cf=0;printf("Enter2number:
\n");
scanf("%s",a1);printf("/\n");
scanf("%s",b1);
cf|=ston(a1,a);
cf|=ston(b1,b);
}while(cf);/*输入被除数和除数,如果转换出错,则重输*/
passc(a,b,c);/*执行相除运算*/
printlong(a);printf("/");/*打印结果*/
printlong(b);printf("=");
printlong(c);printf("\n");
printf("\n");bioskey(0);
}
2.主函数代码
voidmain()/*main*/
{intc;
clrscr();
textcolor(BLUE);
printf("***********************************************\n");printf("*********WelcometoThunderstudio!
************\n");
printf("***********************************************\n");
printf("*********本程序实现长整数四则运算**************\n");
one:
printf("1:
------HELP\n");
printf("2:
------ADD\n");
printf("3:
------SUBTRACT\n");
printf("4:
------MULTIPLY\n");
printf("5:
------DiVISION\n");
printf("6:
------EXIT\n");
for(;;){c=getch();
switch(atoi(&c)){
case1:
clrscr();gotoone;break;
case2:
add();break;
case3:
subtract();break;
case4:
multiply();break;
case5:
division();break;
case6:
textcolor(BLUE);printf("\n------------------------------------------------------------\n");
printf("Thankscw'swork!
!
\n");
break;
default:
textcolor(4);
printf("Sorrypleaseinputrightnumber!
\n");
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<回车>输出“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,0001,0001<回车>-1,0001,0001<回车>输出"1"