⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bigno1_1.c

📁 无限位的大数加减运算
💻 C
字号:
/* 
* Copyright (c) 信息学院03计算机3班
* All rights reserved. 
* 
* 文件名称: bigno.c 
* 文件标识: 数据结构课程设计
* 摘 要: 大数加减运算 
* 
* 当前版本: 1.1 
* 作 者: 李南宁 
* 完成日期: 2005年4月6日 
* 原始版本: 1.0 
* 作 者: 李南宁 
* 完成日期: 2005年4月3日 
*/ 

#include<stdio.h>
#include<malloc.h>
#include<string.h>
int sum1,sum2,sum,sum3,index,jud,brk,choose1;

char sign1,sign2,sign;
struct list{
	char inf;
	struct list *f;
	struct list *r;
};
typedef struct list* number;
number num1=0,num2=0,num3;
number create(number num)
{
	number p1,p2;
	int i;
p1=p2=(number)malloc(sizeof(struct list));
if(1 == index&&0 == sum&&0 == sum1) printf("\n请重新输入算式:");
else   if(0 == sum&&0 == sum1)	printf("\n请输入算式:");
loop:p1->inf=getche();
	 if(p1->inf ==27) {printf("\n                                 谢谢使用!\n");brk=1;return;}
if(0==sum1&&0 == sum&&'-' == p1->inf) {sign1='-';goto loop;}
	if(p1->inf=='+'||p1->inf=='-'||p1->inf=='='&&sum1!=0) {sign=p1->inf;return num; }
	else if(p1->inf<'0'||p1->inf>'9') 
	{
lop:	printf("\n输入错误.按r整个算式重新输入,按b退回一位输入.");
	p1->inf=getche();
	if('r'==p1->inf) {index=1;return p1; }
else 	if('b'==p1->inf ) {printf("\n继续这个算式:");
		if(sum1!=0&&choose1!='c')
		{	num3=num1;
			for(i=0;i<sum1;i++)
		{putchar(num3->r->inf);
			num3=num3->r;}
			putchar(sign);
		num3=num;
		for(i=0;i<sum;i++)
		{putchar(num3->r->inf);
			num3=num3->r;}
		}
		else
		{	num3=num;
			for(i=0;i<sum;i++)
		{putchar(num3->r->inf);
			num3=num3->r;}}
	goto loop;}
	else goto lop;}
	sum++;
	p2=p1;
	if(1 == sum)   {p1->f=num;p1->r=num;num=p1;num->f=num;num->r=num;}
	else
	{  p1->f=num;
	   num->r=p1;
	   	num2=p1;
		for(i=0;i<sum-1;i++)
		{
		num2=num2->f;}
        p1->r=num2;
		num2->f = p1;
		num=p1;}
	    create(num);
}

judge()
{
	number p1,p2;
	int i;
	p1=num1;
	p2=num2;
	if(sum1>sum2) {jud=1;return jud;}
	else if(sum2>sum1) {jud=2;return jud;}
	else
	for(i=0;i<sum1;i++)
	{
		if(p1->r->inf>p2->r->inf ) {jud=1;return jud;}
		else if(p2->r->inf>p1->r->inf )  {jud=2;return jud;}
		else {p1=p1->r;p2=p2->r;}
	}
	if(i==sum1) {jud=0;return jud;}
}

addcompute()
{
	number p1,p2,p3,p4;
	int jw=0;
	int m;
	sum3=0;
	p1=num1;
	p2=num2;
	p4=p3=(number)malloc(sizeof(struct list));
	while(p1&&p2)
	{
        sum3++;
        m=jw+p1->inf-'0'+p2->inf-'0';
		p3->inf=m%10+'0';
	if(sum3==1) num3=p3;
	else {p4->f=p3;p3->r=p4;}
		p4=p3;
		m/=10;
		if(m) jw=1;
		else jw=0;
			p3=(number)malloc(sizeof(struct list));
			p1=p1->f;
			p2=p2->f;
	}
while(p1)
{   sum3++;
	m=jw+p1->inf-'0';
	p3->inf =m%10+'0';
	p4->f=p3;p3->r=p4;p4=p3;
	m/=10;
	if(m) jw=1;
	else jw=0;
		p3=(number)malloc(sizeof(struct list));
		p1=p1->f;	
}	
if(jw) {sum3++;p3->inf ='1';
	p4->f=p3;p3->r=p4;p4=p3;
p3=(number)malloc(sizeof(struct list));
}
	p4->f=num3;
	num3->r=p4;
}

subcompute()
{
	number p1,p2,p3,p4;
	int jw=0;
	int m;
	sum3=0;
	p1=num1;
	p2=num2;
	p4=p3=(number)malloc(sizeof(struct list));
	while(p1&&p2)
	{
 sum3++;
        m=p1->inf-'0'-(p2->inf-'0')-jw;
		if(m<0) {jw=1;m+=10;}
		else jw=0;
		p3->inf=m+'0';
		if(sum3==1) {num3=p3;}
	else {p4->f=p3;p3->r=p4;}
		p4=p3;
		    p3=(number)malloc(sizeof(struct list));
			p1=p1->f;
			p2=p2->f;
	}
while(p1)
{sum3++;
	m=p1->inf-'0'-jw;
	if(sum3==sum1&&m==0) {sum3--;break;} 
	if(m<0) {jw=1;m+=10;}
		else jw=0;
		p3->inf=m+'0';
       p4->f=p3;p3->r=p4;p4=p3;
       p3=(number)malloc(sizeof(struct list));
			p1=p1->f;	
}	
	p4->f=num3;
	num3->r=p4;
}
	
main()
{
	int choose,i,temp,choose3;
	number result;
	while(1)
	{   brk=0;
	    system("cls");
	    printf("\n\n               ******************************************************\n");
	    printf("                 1.十进制大数运算.");
		printf("(输入格式为:1+1=,或者-1-1=……)\n");
	    printf("                 2.退出! (如果在输入过程中要退出请按ESC键)\n");
		printf("               ******************************************************\n");
	    printf("                 请输入:");
	    scanf("%d",&choose);
	    if (2 == choose) break;
		if (1 == choose)
		{index=0;
loop:  sign1='+';
		num1=0;	num2=0; sum1=0; sum2=0; sum=0;
		num1 = create(num1);
	if(brk) return;
if(num1->inf == 'r') goto loop;
if(sum!=1&&num1->r->inf =='0') {printf("输入不规范!\n");goto loop;}
    sum1=sum;
	    sum=0;
	sign2=sign;
coop:	num2 = create(num2);
			if(brk) return;
			if(num2->inf == 'r') goto loop;	
			if(sum!=1&&num2->r->inf =='0') 
			{       printf("输入不规范!\n");
		            result=num1;
			        sum=0;
			        for(i=0;i<sum1;i++)
					{putchar(result->r->inf);
			        result=result->r;}
		            putchar(sign2);goto coop;
			}
		sum2=sum;
		jud=judge();
		if(jud==2)
		{result=num1;num1=num2;num2=result;
		temp=sum1;sum1=sum2;sum2=temp;
		temp=sign1;sign1=sign2;sign2=temp;}	
		num1->r->f=0;
		num2->r->f=0;
	if(sign1=='+'&&sign2=='+')
		{addcompute();sign='+';}
		else if(sign1=='-'&&sign2=='-')
		{addcompute();sign='-';}
		else if(jud==0) {printf("0");getch();continue;}
		else if(sign1=='-'&&sign2=='+')
		{subcompute();sign='-';}
		else 
		{subcompute();sign='+';}
		if(sign=='-')
			putchar(sign);
			for(i=0;i<sum3;i++)
		{putchar(num3->r->inf);
		num3=num3->r;}
			printf("\n\n按c继续上次数据运算\n按其他键回到菜单");
choose1=getche();
printf("\n\n");
if(choose1 == 'c') 
{
      if(sign=='-')
			putchar(sign);
			for(i=0;i<sum3;i++)
		{putchar(num3->r->inf);
		num3=num3->r;}
			sign1=sign;
           num1=num3;
			 sum1=sum3;
	    sum=0;
	sign2=getche();
			goto coop;
} 
		}
		else {printf("                 输入错误!\n");continue;}
			getch();
	}
}

	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -