一套高精度加减乘除算法,挑战计算机中的不可能

办法总比困难多不是吗?

最近几天也是钻研了几个朋友告诉我的关于高精度的加减乘除问题,一开始接触的时候确实有着那么一些晦涩难以理解,但是当你慢慢深入进去就会发现它还是有着它的意义之处的,对于除法的话,可能有着那么一些晦涩难懂,大家只要一步步的去明白,那么也是可以自己编写出来的。

高精度加减乘除

**高精度加法**
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef  struct HA {
	char num[102];
	int size;
} HighAcc;

HighAcc dealNum(char * num){
	int i = 0;
	int len = strlen(num);
	HighAcc tem = { 0 };
	for (; i < len; i++){
		tem.num[i] = num[len - 1 - i] - '0';	
	}
	tem.size = len;
	return tem;
}

HighAcc add(HighAcc num1, HighAcc num2)
{
	int longer = num1.size > num2.size ? num1.size : num2.size;
	HighAcc res = { 0 };

	int i;
	int tmp;
	for (i = 0; i < longer; i++)
	{
		tmp = num1.num[i] + num2.num[i] + res.num[i];
		res.num[i] = tmp % 10;
		res.num[i + 1] = tmp / 10;
	}
	res.size = longer + res.num[i];
	return res;
}

void PrintNum(HighAcc num){
	int i=0;
	for (i = num.size - 1; i>=0; i--){
		printf("%d", num.num[i]);
	}
}
int main(){
	char num[102] = { 0 };
	scanf("%s", num);
	HighAcc num1 = dealNum(num);
	scanf("%s", num);
	HighAcc num2 = dealNum(num);
	HighAcc res = add(num1, num2);
	PrintNum(res);
	system("pause");
	return 0;
	}

**高精度乘法**
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Hh{
	char num[102];
	int size;
}HighAcc;

HighAcc DealNum(char *num){
	int i;
	HighAcc temp = { 0 };
	int len = strlen(num);
	for (i = 0; i < len; i++){
		temp.num[i] = num[len - 1 - i] - '0';
	}
	temp.size = len;
	return temp;
}


HighAcc Mul(HighAcc num1, HighAcc num2){
	HighAcc res = { 0 };
	if (num1.size == 1 && num1.num[0] == 0 ||
		num2.size == 1 && num2.num[0] == 0)
	{
		res.size = 1;
		return res;
	}

	int i, j;
	int tmp;
	for (i = 0; i < num1.size; i++)
	{
		for (j = 0; j < num2.size; j++)
		{
			tmp = num1.num[i] * num2.num[j] + res.num[i + j];
			res.num[i + j] = tmp % 10;
			res.num[i + j + 1] += tmp / 10;
		}
	}
	res.size = i + j - !res.num[i + j - 1];
	return res;
}


void PrintNum(HighAcc num){
	int i;
	for (i = num.size - 1; i >= 0; i--){
		printf("%d", num.num[i]);
	}
}

int main(){
	char num[102] = { 0 };
	scanf("%s", num);
	HighAcc num1 = DealNum(num);
	scanf("%s", num);
	HighAcc num2 = DealNum(num);
	HighAcc res = Mul(num1, num2);
	PrintNum(res);
	system("pause");
	return 0;
}

**高精度减法**
#include <stdio.h>
#include <string.h>

typedef struct HA{
	char num[102];
	int size;
	char minusflag;
}HighAcc;

HighAcc dealNum(char * src)
{
	int i = 0, len = strlen(src);
	HighAcc tmp = { 0 };
	for (; i < len; i++)
	{
		tmp.num[i] = src[len - 1 - i] - '0';
	}
	tmp.size = len;
	tmp.minusflag = 0;

	return tmp;
}

HighAcc add(HighAcc num1, HighAcc num2)
{
	int longer = num1.size > num2.size ? num1.size : num2.size;
	HighAcc res = { 0 };

	int i;
	int tmp;
	for (i = 0; i < longer; i++)
	{
		tmp = num1.num[i] + num2.num[i] + res.num[i];
		res.num[i] = tmp % 10;
		res.num[i + 1] = tmp / 10;
	}
	res.size = longer + res.num[i];
	return res;
}

int hacmp(HighAcc num1, HighAcc num2)
{
	if (num1.size > num2.size)
	{
		return 1;
	}
	else if (num1.size < num2.size)
	{
		return -1;
	}

	int i;
	for (i = num1.size - 1; i >= 0; i--)
	{
		if (num1.num[i] > num2.num[i])
		{
			return 1;
		}
		else if (num1.num[i] < num2.num[i])
		{
			return -1;
		}
	}

	return 0;
}

HighAcc sub(HighAcc num1, HighAcc num2)
{
	HighAcc res = { 0 };
	HighAcc bigger = num1;
	HighAcc smaller = num2;
	int ret = hacmp(num1, num2);
	if (ret == 0)
	{
		res.size = 1;
		return res;
	}
	else if (ret < 0)
	{
		res.minusflag = 1;
		bigger = num2;
		smaller = num1;
	}

	int i;
	int tmp;
	for (i = 0; i < bigger.size; i++)
	{
		tmp = 10 + bigger.num[i] - smaller.num[i] + res.num[i];
		res.num[i] = tmp % 10;
		res.num[i + 1] = tmp / 10 - 1;
	}

	res.size = bigger.size;
	for (i = bigger.size - 1; res.num[i] == 0; i--)
	{
		res.size--;
	}
	return res;
}

HighAcc mul(HighAcc num1, HighAcc num2)
{
	HighAcc res = { 0 };

	if (num1.size == 1 && num1.num[0] == 0 ||
		num2.size == 1 && num2.num[0] == 0)
	{
		res.size = 1;
		return res;
	}

	int i, j;
	int tmp;
	for (i = 0; i < num1.size; i++)
	{
		for (j = 0; j < num2.size; j++)
		{
			tmp = num1.num[i] * num2.num[j] + res.num[i + j];
			res.num[i + j] = tmp % 10;
			res.num[i + j + 1] += tmp / 10;
		}
	}
	res.size = i + j - !res.num[i + j - 1];
	return res;
}

void printNum(HighAcc tmp)
{
	int i;
	if (tmp.minusflag)
	{
		putchar('-');
	}

	for (i = tmp.size - 1; i >= 0; i--)
	{
		printf("%d", tmp.num[i]);
	}
}

int main()
{
	char tmp[102] = { 0 };
	scanf("%s", tmp);
	HighAcc num1 = dealNum(tmp);
	scanf("%s", tmp);
	HighAcc num2 = dealNum(tmp);
	HighAcc res = sub(num1, num2);
	printNum(res);
	return 0;
}
高精度除法
#include <stdio.h>
#include <string.h>

typedef struct HA{
	char num[102];
	int size;
	char minusflag;
}HighAcc;

HighAcc dealNum(char * src)
{
	int i = 0, len = strlen(src);
	HighAcc tmp = { 0 };
	for (; i < len; i++)
	{
		tmp.num[i] = src[len - 1 - i] - '0';
	}
	tmp.size = len;
	tmp.minusflag = 0;

	return tmp;
}

int hacmp(char * num1, int size1, char * num2, int size2)
{
	if (size1 > size2)
	{
		return 1;
	}
	else if (size1 < size2)
	{
		return -1;
	}

	int i;
	for (i = size1 - 1; i >= 0; i--)
	{
		if (num1[i] > num2[i])
		{
			return 1;
		}
		else if (num1[i] < num2[i])
		{
			return -1;
		}
	}

	return 0;
}

int sub(char * num1, int size1, char * num2, int size2)
{
	HighAcc res = { 0 };

	int i;
	int tmp;
	for (i = 0; i < size1; i++)
	{
		tmp = 10 + num1[i] - num2[i] + res.num[i];
		res.num[i] = tmp % 10;
		res.num[i + 1] = tmp / 10 - 1;
	}

	int count = 0;
	for (i = size1 - 1; res.num[i] == 0 && i >= 0; i--)
	{
		count++;
		num1[i] = 0;
	}

	for (; i >= 0; i--)
	{
		num1[i] = res.num[i];
	}

	/*int flag = 1;
	for (i = size1 - 1; i >= 0; i--)
	{
	if (res.num[i] == 0 && flag)
	{
	count++;
	}
	else
	{
	flag = 0;
	}
	num1[i] = res.num[i];
	}*/
	return count;
}

HighAcc div(HighAcc num1, HighAcc num2)
{
	int i;
	int count = 0;
	HighAcc res = { 0 };
	int flag = 0;

	for (i = num1.size - 1; i >= 0; i--)
	{
		while (hacmp(num1.num + i, num1.size - i, num2.num, num2.size) >= 0 && i < num1.size)
		{
			num1.size -= sub(num1.num + i, num1.size - i, num2.num, num2.size);
			count++;
		}
		if (flag == 0 && count != 0)
		{
			flag = 1;
			res.size = i + 1;
		}
		res.num[i] = count;
		count = 0;
	}

	return res;
}

HighAcc mod(HighAcc num1, HighAcc num2)
{
	int i;

	for (i = num1.size - 1; i >= 0; i--)
	{
		while (hacmp(num1.num + i, num1.size - i, num2.num, num2.size) >= 0 && i < num1.size)
		{
			num1.size -= sub(num1.num + i, num1.size - i, num2.num, num2.size);
		}
	}

	if (num1.size == 0)
	{
		num1.size = 1;
	}
	return num1;
}

void printNum(HighAcc tmp)
{
	int i;
	if (tmp.minusflag)
	{
		putchar('-');
	}

	for (i = tmp.size - 1; i >= 0; i--)
	{
		printf("%d", tmp.num[i]);
	}
}

int main()
{
	char tmp[102] = { 0 };

	scanf("%s", tmp);
	HighAcc num1 = dealNum(tmp);
	scanf("%s", tmp);
	HighAcc num2 = dealNum(tmp);

	HighAcc res1 = div(num1, num2);
	HighAcc res2 = mod(num1, num2);

	printNum(res1);
	putchar('\n');
	printNum(res2);
	return 0;
}

这两天因为时间紧张,我先把代码给大家上传上来,之后会进行逐句的注释,为了自己也为了别人。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值