正数高精度运算

功能描述:进行高长度非负数据的高精度相加运算
长度限制:受内存限制
实现原理:栈的调用
输入限制:正经用户的正常输入,相加的数据在同一换行前,数与数之间仅用一个空格隔开,以文件结束符为运行结束标志,输入样例如下:

2.99792 3.141592658
2.71828 520.1314

郑重声明:在符合要求的输入情况下,仍然可能存在未明BUG,如果发现,请留言
具体实现:

#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 200
#define STACK_INCREMENT 100

typedef char ElemType;
typedef struct Stack
{
 	ElemType *base;
 	ElemType *top;
 	int stack_size;
} STACK, *PSTACK;

void init_stack(PSTACK stack);
void push(PSTACK stack, ElemType elem);
void pop(PSTACK stack, ElemType *elem);
void clear_stack(PSTACK stack);
int stack_length(PSTACK stack);
void destory_stack(PSTACK stack);

int main(void)
{
 	STACK integer_1, integer_2, result_integer;
 	STACK decimal_1, decimal_2, result_decimal;
 	STACK temp;
 	ElemType elem, a, b, c;
 	char ch;
 	int flag = 0;
 	int decimal = 0;
 	int carry = 0;
	int output_decimal = 0;

	init_stack(&integer_1);
	init_stack(&integer_2);
 	init_stack(&result_integer);
 	init_stack(&decimal_1);
 	init_stack(&decimal_2);
 	init_stack(&result_decimal);
 	init_stack(&temp);

	while((ch = getchar()) != EOF)
 	{
  		if(ch != '\n')
  		{
   			if(ch == ' ')
   			{
    				flag = 1;
    				decimal = 0;
    				ch = getchar();
   			}
   			
   			if(!flag)    // 第一个数 
   			{
    				if(ch == '.')
    				{
     					decimal = 1;
     					ch = getchar();
    				}
    				if(!decimal)    // 整数部分 
    				{
     					push(&integer_1, ch);
    				}
    				else    // 小数部分 
    				{
     					push(&decimal_1, ch);
    				}
   			}
   			else    // 第二个数
   			{
    				if(ch == '.')
    				{
     					decimal = 1;
     					ch = getchar();
    				}
    				if(!decimal)    // 整数部分
    				{
     					push(&integer_2, ch);
    				}
    				else    // 小数部分 
    				{
     					push(&decimal_2, ch);
    				}
   			}
  		}
  		else
  		{
   			if(stack_length(&decimal_1) != stack_length(&decimal_2))    // 进行小数部分相加 
   			{
    				while(stack_length(&decimal_1) > stack_length(&decimal_2))
    				{
     					pop(&decimal_1, &c);
     					push(&result_decimal, c);
    				}
    				while(stack_length(&decimal_1) < stack_length(&decimal_2))
    				{
     					pop(&decimal_2, &c);
     					push(&result_decimal, c);
    				}
   			}
   			while(stack_length(&decimal_1))
   			{
    				pop(&decimal_1, &a);
    				pop(&decimal_2, &b);
    				c = (a-'0') + (b-'0') + carry + '0';
    				if(c > '9')
    				{
     					c = c - 10;
     					carry = 1;
    				}
    				else
    				{
     					carry = 0;
    				}
    				push(&result_decimal, c);
   			}
   			if(stack_length(&integer_1) != stack_length(&integer_2))    // 进行整数部分相加 
   			{
    				if(stack_length(&integer_1) > stack_length(&integer_2))
    				{
     					while(stack_length(&integer_1))
     					{
      						if(stack_length(&integer_2) != 0)
      						{
       							pop(&integer_1, &a);
       							pop(&integer_2, &b);
       							c = (a-'0') + (b-'0') + carry + '0';
       							if(c > '9')
       							{
        							c = c - 10;
        							carry = 1;
       							}
       							else
       							{
        							carry = 0;
       							}
       							push(&result_integer, c);
      						}
      						else
      						{
       							pop(&integer_1, &a);
       							c = (a-'0') + carry + '0';
       							if(c > '9')
       							{
        							c = c - 10;
        							carry = 1;
       							}
       							else
       							{
        							carry = 0;
       							}
       							push(&result_integer, c);
      						}
     					}
     					if(carry == 1)
     					{
      						push(&result_integer, '1');
      						carry = 0;
     					}
    				}
    				if(stack_length(&integer_1) < stack_length(&integer_2))
    				{
     					while(stack_length(&integer_2))
     					{
      						if(stack_length(&integer_1) != 0)
      						{
       							pop(&integer_1, &a);
       							pop(&integer_2, &b);
       							c = (a-'0') + (b-'0') + carry + '0';
       							if(c > '9')
       							{
        							c = c - 10;
        							carry = 1;
       							}
       							else
      		 					{
        							carry = 0;
       							}
       							push(&result_integer, c);
      						}
      						else
      						{
       							pop(&integer_2, &a);
       							c = (a-'0') + carry + '0';
       							if(c > '9')
       							{
        							c = c - 10;
        							carry = 1;
       							}
       							else
       							{
        							carry = 0;
       							}
       							push(&result_integer, c);
      						}
     					}
     					if(carry == 1)
     					{
      						push(&result_integer, '1');
      						carry = 0;
     					}
    				}
   			}
   			else
   			{
    				while(stack_length(&integer_1))
    				{
     					pop(&integer_1, &a);
     					pop(&integer_2, &b);
     					c = (a-'0') + (b-'0') + carry + '0';
     					if(c > '9')
     					{
      						c = c - 10;
      						carry = 1;
     					}
     					else
     					{
      						carry = 0;
     					}
     					push(&result_integer, c);
    				}
    				if(carry == 1)
    				{
     					push(&result_integer, '1');
     					carry = 0;
    				}
   			}
   			while(stack_length(&result_decimal))
   			{
    				pop(&result_decimal, &elem);
    				push(&temp, elem);
   			}
   			while(stack_length(&temp))
   			{
    				pop(&temp, &elem);
    				if(elem != '0')
    				{
     					output_decimal = 1;
    				}
    				if(output_decimal)
    				{
     					push(&result_decimal, elem);
    				}
   			}
   			while(stack_length(&result_integer))
   			{
    				pop(&result_integer, &elem);
    				putchar(elem);
   			}
   			if(output_decimal)
   			{
    				putchar('.');
    				while(stack_length(&result_decimal))
    				{
     					pop(&result_decimal, &elem);
     					putchar(elem);
    				}
   			}
   			putchar('\n');
   			
   			clear_stack(&integer_1);
   			clear_stack(&integer_2);
   			clear_stack(&result_integer);
   			clear_stack(&decimal_1);
   			clear_stack(&decimal_2);
   			clear_stack(&result_decimal);
   			clear_stack(&temp);
   			flag = 0;
   			decimal = 0;
   			output_decimal = 0;
  		}
 	}

	destory_stack(&integer_1);
 	destory_stack(&integer_2);
 	destory_stack(&result_integer);
 	destory_stack(&decimal_1);
 	destory_stack(&decimal_2);
 	destory_stack(&result_decimal);
 	destory_stack(&temp); return 0;
}

void init_stack(PSTACK stack)
{
 	stack->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
 	if(!stack->base)
 	{
  		exit(1);
 	}
 	
 	stack->top = stack->base;
 	stack->stack_size = STACK_INIT_SIZE;
}

void push(PSTACK stack, ElemType elem)
{
 	if(stack->top - stack->base >= stack->stack_size)
 	{
  		stack->base = (ElemType *)realloc(stack->base, (stack->stack_size+STACK_INCREMENT) * sizeof(ElemType));
  		if(!stack->base)
  		{
   			exit(1);
  		}

		stack->top = stack->base + stack->stack_size;
  		stack->stack_size = stack->stack_size + STACK_INCREMENT;
 	}

	*(stack->top) = elem;
 	stack->top++;
}

void pop(PSTACK stack, ElemType *elem)
{
 	if(stack->top == stack->base)
 	{
  		return;
 	}

	*elem = *--(stack->top);
}

void clear_stack(PSTACK stack)
{
 	stack->top = stack->base;
}

int stack_length(PSTACK stack)
{
 	return stack->top - stack->base;
}

void destory_stack(PSTACK stack)
{
 	free(stack->base); stack->base = NULL;
 	stack->top = NULL;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值