📄 changzhengshu.txt
字号:
/*to add the two integers*/
#include "stdio.h"
#include "string.h"
typedef struct dbnode
{
int data;
struct dbnode *prior,*next;
}dblinklist;
/*to define the doublelinklist*/
dblinklist *m,*n,*sum;
int done1,done2,len1,len2;
/*to initiate the doublelinklist*/
int initiate()
{
m=(dblinklist *)malloc(sizeof(dblinklist));
m->prior=m->next=m;
n=(dblinklist *)malloc(sizeof(dblinklist));
n->prior=n->next=n;
sum=(dblinklist *)malloc(sizeof(dblinklist));
sum->prior=sum->next=sum;
return 0;
}
/*to insert the doublelinklist*/
int insert(dblinklist *q,int w,int i)
{
int k=1;
dblinklist *p=q, *r;
r=(dblinklist *)malloc(sizeof(dblinklist));
r->data=w;
r->prior=r->next=NULL;
if(i<0)
return 0;
while(k<i)
{
p=p->next;
k++;
}
r->next=p->next;
r->next->prior=r;
p->next=r;
r->prior=p;
return 1;
}
/*to judge magnitude of two integers without considing the sign of two integers*/
int judgement1(dblinklist *m,dblinklist *n,int len1,int len2)
{
dblinklist *p=m->next,*q=n->next;
if (len1<len2)
return -1;
else if(len1>len2)
return 1;
else
{
while(p!=m)
p=p->next;
while(q!=n)
q=q->next;
while(p->data==q->data&&p!=m&&q!=n)
{
p=p->prior;
q=q->prior;
}
if(p->data<q->data)
return -1;
else if(p->data>q->data)
return 1;
else
return 0;
}
}
/*n-m&&n>m without considing the sign of two integers*/
int judgement2(dblinklist *m,dblinklist *n)
{
int summation,count=0;
dblinklist *p=m->next,*q=n->next;
while( p!=m&&q!=n)
{
if(p->data<0)
{
p->data+=10000;
p->next->data-=1;
}
summation=p->data-q->data;
if(summation<0)
{
summation+=10000;
p->next->data-=1;
}
insert(sum,summation,++count);
p=p->next;
q=q->next;
}
if(q==n&&p!=m)
{
while(p!=m)
{
if(p->data<0)
{
p->data+=10000;
p->next->data-=1;
}
summation=p->data;
p=p->next;
insert(sum,summation,++count);
}
}
return 0;
}
/*to print the doublelinklist*/
int printlist1(dblinklist *u)
{
dblinklist *p=u->next;
int done=0;
if(p->data==0&&p->next==u)
{
printf("0");
return 1;
}
while(p!=u)
p=p->next;
p=p->prior;
if(p->data!=0)
{
done=1;
printf("%d",p->data);
p=p->prior;
}
while(p!=u)
{
if(p->data!=0&&!done)
{
done=1;
printf("%d",p->data);
}
else if(p->data!=0&&done)
printf(",%04d",p->data);
else if (p->data==0)
{
if(done)
printf(",0000");
}
p=p->prior;
}
if(!done)
printf("0");
return 0;
}
int inport()
{
char numstr[10000]={'\0'};
int z, i, j,sum, count,done,integer[4];
gotoxy(2,6);
printf("press 'e' to exit...");
gotoxy(2,7);
printf("please input the frist integer:");
fflush(stdin);
scanf("%s",numstr);
if(strcmp(numstr,"E")==0||strcmp(numstr,"e")==0)
return 0;
len1=strlen(numstr);
done1=0;
if(numstr[0]=='-')
{
z=1;
done1=1;
}
else
z=0;
done=0;
count=0;
for(i=len1-1;i>=z;i--)
{
if(numstr[i]!=',')
integer[done++]=numstr[i]-'0';
else if(numstr[i]==',')
continue;
if(done==4||i==z)
{
sum=0;
for(j=done-1;j>=0;j--)
sum=sum*10+integer[j];
insert(m,sum,++count);
if(done==4)
done=0;
}
}
len1=count;
m->data=(1-2*done1)*len1;
memset(numstr,'\0',10000);
printf("please input the second integer:");
scanf("%s",numstr);
len2=strlen(numstr);
done2=0;
if(numstr[0]=='-')
{
z=1;
done2=1;
}
else
z=0;
done=0;
count=0;
for(i=len2-1;i>=z;i--)
{
if(numstr[i]!=',')
integer[done++]=numstr[i]-'0';
else if(numstr[i]==',')
continue;
if(done==4||i==z)
{
sum=0;
for(j=done-1;j>=0;j--)
sum=sum*10+integer[j];
insert(n,sum,++count);
if(done==4)
done=0;
}
}
len2=count;
n->data=(1-2*done2)*len2;
return 1;
}
/*to print the sum of two integers*/
int printlist2(int k)
{
gotoxy(1,12);
if(done1)
printf("-");
printlist1(m);
getch();
if(done2)
printf("-");
else
printf("+");
printlist1(n);
printf("=");
if(!done1&&!done2||done1&&done2)
{
if(done1&&done2)
printf("-");
printlist1(sum);
}
else if(!done1&&done2)
{
if(k==1)
printlist1(sum);
else if(k==-1)
{
printf("-");
printlist1(sum);
}
else
printf("0\n");
}
else if(done1&&!done2)
{
if(k==-1)
printlist1(sum);
else if (k==1)
{
printf("-");
printlist1(sum);
}
else
printf("0\n");
}
printf("\n");
return 0;
}
int main()
{
int i,num,sum1,k;
char *group[80*20*2];
dblinklist *p=NULL,*q=NULL;
textcolor(14);
textbackground(1);
clrscr();
while(1)
{
gotoxy(30,2);
textcolor(14);
printf("adding two long integers");
gotoxy(15,3);
textcolor(4);
printf("designed by liudali ");
gotoxy(30,4);
textcolor(14);
printf("my changzhengshu");
gettext(1,1,80,20,group);
clrscr();
puttext(1,1,80,20,group);
textcolor(14);
initiate();
k=inport();
if(!k)
return 0;
clrscr();
gotoxy(1,12);
if(done1)
printf("-");
printlist1(m);
if(done2)
printf("-");
else
printf("+");
printlist1(n);
printf("=");
p=m->next;
q=n->next;
num=0;
i=0;
if(!done1&&!done2||done1&&done2) /*to deal with two integers with the same sign*/
{
while(p!=m&&q!=n)
{
sum1=p->data+q->data+num;
num=sum1/10000;
sum1%=10000;
insert(sum,sum1,++i);
p=p->next;
q=q->next;
}
if(p==m&&q!=n)
{
while(q!=n)
{
sum1=q->data+num;
num=sum1/10000;
sum1%=10000;
insert(sum,sum1,++i);
q=q->next;
}
}
else if(p!=m&&q==n)
{
while(p!=m)
{
sum1=p->data+num;
num=sum1/10000;
sum1%=10000;
insert(sum,sum1,++i);
p=p->next;
}
}
if(num)
insert(sum,num,++i);
}
else if(!done1&&done2)
{
k=judgement1(m,n,len1,len2);
if(k==1)
judgement2(m,n);
else if(k==-1)
judgement2(n,m);
}
else if(done1&&!done2)
{
k=judgement1(n,m,len1,len2);
if(k==-1)
judgement2(n,m);
else if(k==1)
judgement2(m,n);
}
printlist2(k);
p=m->next;
while(p!=m)
{
q=p;
free(p);
p=q->next;
}
free(m);
q=n->next;
while(q!=n)
{
p=q;
free(q);
q=p->next;
}
free(n);
q=sum->next;
while(q!=sum)
{
p=q;
free(q);
q=p->next;
}
free(sum);
}
closegraph();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -