高精度加减法(选作)

【题】

高精度加减法(选作)


背景:

计算机所能完成的一个基本功能就是完成数据的计算,譬如加法、减法等等。但是在任何一种计算机上,计算中能够使用的数字都是有一定范围的,超过了范围,就没法得到精确的结果。

你现在接受了一个任务,要编写一个高精度计算器的核心部分。所谓高精度计算器,就是可以计算很大很大的数据的计算器。

输入:

输入的第一行是一个正整数,表示下面有几组数据需要计算。之后的每一行是两个十进制的正整数和一个运算符,每个整数可以由最多 500 个数字组成。运算符可以是加号或者减号。

输出:

对应着输入的每一行数据,输出计算的结果,每个结果占一行。

  测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示
  1. 2↵
  2. 213914+23466123↵
  3. 32862934-23481243↵
以文本方式显示
  1. 23680037↵
  2. 9381691↵
1秒 64M 0
测试用例 2 以文本方式显示
  1. 3↵
  2. 483291674192731231+1236187236812735123↵
  3. 123129678463287562378-28935687264871236↵
  4. 999999999+1↵
以文本方式显示
  1. 1719478911005466354↵
  2. 123100742776022691142↵
  3. 1000000000↵
1秒 64M 0

【代码】

1、高精度加法:(引用自 小蜜蜂-斐波那契数列-大数加法)
#include "stdio.h"
#include "stdlib.h"

#define N 22				//22位能表示第100个以内的斐波那契数列值

char * Add(char * x1, char * x2);
void Output(char * y);

int main()
{
	int i;

	//y = x1 + x2;
	char * x1 = (char *)malloc(sizeof(char) * N);
	char * x2 = (char *)malloc(sizeof(char) * N);
	char * y = (char *)malloc(sizeof(char) * N);

	//初始化y, x1, x2
	for (i = 0; i < N; i++)
	{
		x1[i] = '\0';
		x2[i] = '\0';
		y[i] = '\0';
	}

	//给x1和x2赋初值
	//x1 = 1256
	//x2 = 567
	x1[0] = '6';	x1[1] = '5';	x1[2] = '2';	x1[3] = '1';
	x2[0] = '7';	x2[1] = '6';	x2[2] = '5';	


	y = Add(x1, x2);

	//输出
	Output(x1);
	printf(" + ");
	Output(x2);
	printf(" = ");
	Output(y);

	printf("\n");
    return 0; 
}

//大数加法函数
char * Add(char * x1, char * x2)
{
 	char * y = (char *) malloc(sizeof(char *) * N);
	int i = 0;
	int t = 0;				//表示进位

	//实现大数加法,数组前面存的是数值的高位。如123在数组中是{'3','2','1','\0'}
	//处理相同长度的部分
	while(x1[i] != '\0' && x2[i] != '\0')
	{
		y[i] = (x1[i] - '0' + x2[i] - '0' + t) % 10 + '0';
		t = (x1[i] - '0' + x2[i] - '0' + t) / 10;
		i++;
	}
	//如果x1比x2长
	while(x1[i] != '\0')
	{
		y[i] = (x1[i] - '0' + t) % 10 + '0';
		t = (x1[i] - '0' + t) / 10;
		i++;
	}
	//如果x2比x1长
	while(x2[i] != '\0')
	{
		y[i] = (x2[i] - '0' + t) % 10 + '0';
		t = (x2[i] - '0' + t) / 10;
		i++;
	}
	//如果还有进位
	if (t == 1)
	{
		y[i++] = '1';
	}
	y[i] = '\0';
 	return y;
}

//输出
void Output(char * y)
{	
	//先找到\0的位置,然后逆序输出
	int i = 0;
	while(y[i] != '\0')
	{
		i++;
	}
	i--;
	while(i >= 0)
	{
		printf("%d", y[i--] - '0');
	}
}

2、高精度剑法:
          Coming  soon...



你可能感兴趣的:(C语言基础)