大数运算(.h文件)QAQ

本文介绍了一个自制的大数运算头文件,包含加、减、乘、除等基本运算的实现,适用于处理超出标准数据类型范围的数值计算。通过字符串操作进行大数运算,确保了高精度和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己写了一份大数运算头文件,上传以备忘,也欢迎大佬提出意见。

#ifndef __BIGMATH_H_
#define __BIGMATH_H_

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 3000

char s_Multi[M] = { 0 };
int a_Multi[M] = { 0 }, b_Multi[M] = { 0 }, c_Multi[M] = { 0 };

char s_Minus[M] = { 0 };
int a_Minus[M] = { 0 }, b_Minus[M] = { 0 }, c_Minus[M] = { 0 };

char s_Plus[M] = { 0 };
int a_Plus[M] = { 0 }, b_Plus[M] = { 0 }, c_Plus[M] = { 0 };

char s_Div[M] = { 0 }, sr_Div[M] = { 0 }, count_Div[M] = { 0 };

struct Div {
	char sr[M] = { 0 };
	char count[M] = { 0 };
};
struct Div point_Div;

char*  BigMulti(char s[], char t[]);//correct
char*  BigMinus(char s[], char t[]);//correct
char*  BigPlus(char s[], char t[]);//correct
struct Div BigDiv(char s[], char t[]);//correct
int StringCmp(char s[], char t[]);//correct

char* BigMulti(char s[], char t[])
{
	char s1[M] = { 0 }, s2[M] = { 0 };
	strcpy(s1, s);  strcpy(s2, t);
	int i = 0, j = 0, m = 0, n = 0, k = 0, judge = 0;
	if (s1[0] == '-' && s2[0] != '-') {//判断符号
		judge = -1;
		int len = strlen(s1);
		for (i = 1; i < len; i++)
			s1[i - 1] = s1[i];
		s1[len - 1] = 0;
	}
	else if (s1[0] != '-' && s2[0] == '-') {
		judge = -1;
		int len = strlen(s2);
		for (i = 1; i < len; i++)
			s2[i - 1] = s2[i];
		s2[len - 1] = 0;
	}
	else if (s1[0] == '-' && s2[0] == '-') {
		judge = 1;
		int len1 = strlen(s1);
		int len2 = strlen(s2);
		for (i = 1; i < len1; i++) {
			s1[i - 1] = s1[i];
		}
		for (i = 1; i < len2; i++) {
			s2[i - 1] = s2[i];
		}
		s1[len1 - 1] = 0;
		s2[len2 - 1] = 0;
	}
	memset(a_Multi, 0, sizeof(a_Multi));
	memset(s_Multi, 0, sizeof(s_Multi));
	n = strlen(s1);
	m = strlen(s2);
	k = n + m ;
	for (i = n - 1; i >= 0; i--)
		for (j = m - 1; j >= 0; j--)
			a_Multi[(n - 1 - i) + (m - 1 - j)] += (s1[i] - '0') * (s2[j] - '0');
	for (i = 0; i <= m + n -1; i++)
	{
		if (a_Multi[i] >= 10)
		{
			a_Multi[i + 1] += a_Multi[i] / 10;
			a_Multi[i] %= 10;
		}
	}
	while (i >= 0 && a_Multi[i] == 0)
		i--;
	if (i == -1) {
		s_Multi[0] = '0';
	}
	else {
		j = i;
		if (judge == -1)
		{
			s_Multi[0] = '-';
			for (j = 1; j <= i + 1; j++)
				s_Multi[j] = a_Multi[i - j + 1] + '0';
		}
		else
		{
			for (j = 0; j <= i; j++)
				s_Multi[j] = a_Multi[i - j] + '0';
		}
	}
	char* point = s_Multi;
	return point;
}
//////////////////////////////////////////////////////////////
char* BigMinus(char s[], char t[])
{
	char s1[M] = { 0 }, s2[M] = { 0 };
	strcpy(s1, s);  strcpy(s2, t);
	int i = 0, j = 0, m = 0, n = 0, k = 0, judge = 0;
	if ((s1[0] != '-' && s2[0] != '-') || (s1[0] == '-' && s2[0] == '-')) {
		if (s1[0] == '-' && s2[0] == '-') {
			char temp[M] = { 0 };
			strcpy(temp, s1);
			strcpy(s1, s2);
			strcpy(s2, temp);
		}
		if (StringCmp(s1, s2) == -1) {
			judge = -1;
			char temp[M] = { 0 };
			strcpy(temp, s1);
			strcpy(s1, s2);
			strcpy(s2, temp);
		}
		memset(a_Minus, 0, sizeof(a_Minus));
		memset(b_Minus, 0, sizeof(b_Minus));
		memset(c_Minus, 0, sizeof(c_Minus));
		memset(s_Minus, 0, sizeof(s_Minus));
		n = strlen(s1);
		m = strlen(s2);
		for (i = 0; i < n; i++)
			a_Minus[i] = s1[n - i - 1] - '0';
		for (i = 0; i < m; i++)
			b_Minus[i] = s2[m - i - 1] - '0';
		i = 0;
		while (i <= n - 1)
		{
			if (a_Minus[i] >= b_Minus[i])
				c_Minus[i] = a_Minus[i] - b_Minus[i];
			else
			{
				c_Minus[i] = a_Minus[i] - b_Minus[i] + 10;
				a_Minus[i + 1] -= 1;
			}
			i++;
		}
		while (i >= 0 && c_Minus[i] == 0)
			i--;
		if (i == -1)
			s_Minus[0] = '0';
		else {
			for (; i >= 0; i--, k++)
				s_Minus[k] = c_Minus[i] + '0';
		}
	}
	else if (s1[0] == '-' && s2[0] != '-') {
		judge = -1;
		int len = strlen(s1);
		for (i = 1; i < len; i++)
			s1[i - 1] = s1[i];
		s1[len - 1] = 0;
		BigPlus(s1, s2);
		strcpy(s_Minus, s_Plus);
	}
	else if (s1[0] != '-' && s2[0] == '-') {
		int len = strlen(s2);
		for (i = 1; i < len; i++)
			s2[i - 1] = s2[i];
		s2[len - 1] = 0;
		BigPlus(s1, s2);
		strcpy(s_Minus, s_Plus);
	}
	if (judge == -1)
	{
		int len = strlen(s_Minus);
		for (j = len - 1; j >= 0; j--)
			s_Minus[j + 1] = s_Minus[j];
		s_Minus[0] = '-';
	}
	char* point = s_Minus;
	return point;
}
//////////////////////////////////////////////////////////////
char* BigPlus(char s[], char t[])
{
	int i = 0, j = 0, m = 0, n = 0, k = 0, judge = 0;
	char s1[M] = { 0 }, s2[M] = { 0 };
	strcpy(s1, s);  strcpy(s2, t);
	if ((s1[0] != '-' && s2[0] != '-') || (s1[0] == '-' && s2[0] == '-')) {
		if (s1[0] == '-' && s2[0] == '-') {
			judge = -1;
			int len1 = strlen(s1);
			int len2 = strlen(s2);
			for (i = 1; i < len1; i++) {
				s1[i - 1] = s1[i];
			}
			for (i = 1; i < len2; i++) {
				s2[i - 1] = s2[i];
			}
			s1[len1 - 1] = 0;
			s2[len2 - 1] = 0;
		}
		memset(a_Plus, 0, sizeof(a_Plus));
		memset(b_Plus, 0, sizeof(b_Plus));
		memset(c_Plus, 0, sizeof(c_Plus));
		memset(s_Plus, 0, sizeof(s_Plus));
		n = strlen(s1);
		m = strlen(s2);
		for (i = 0; i < n; i++)
			a_Plus[i] = s1[n - i - 1] - '0';
		for (i = 0; i < m; i++)
			b_Plus[i] = s2[m - i - 1] - '0';
		i = 0;
		int max = 0;
		if (n > m)
			max = n;
		else max = m;
		while (i <= max - 1)
		{
			if ((a_Plus[i] + b_Plus[i]) < 10)
				c_Plus[i] = a_Plus[i] + b_Plus[i];
			else
			{
				c_Plus[i] = a_Plus[i] + b_Plus[i] - 10;
				a_Plus[i + 1] += 1;
				if (i == n - 1)
					c_Plus[i + 1] += 1;
			}
			i++;
		}
		i = max;
		while (i >= 0 && c_Plus[i] == 0)
			i--;
		if (i == -1) {
			s_Plus[0] = '0';
		}
		else {
			for (; i >= 0; i--, k++)
				s_Plus[k] = c_Plus[i] + '0';
		}
	}
	else if (s1[0] == '-' && s2[0] != '-') {
		int len = strlen(s1);
		for (i = 1; i < len; i++)
			s1[i - 1] = s1[i];
		s1[len - 1] = 0;
		BigMinus(s2, s1);
		strcpy(s_Plus, s_Minus);
	}
	else if (s1[0] != '-' && s2[0] == '-') {
		int len = strlen(s2);
		for (i = 1; i < len; i++)
			s2[i - 1] = s2[i];
		s2[len - 1] = 0;
		BigMinus(s1, s2);
		strcpy(s_Plus, s_Minus);
	}
	if (judge == -1)
	{
		int len = strlen(s_Plus);
		for (j = len - 1; j >= 0; j--)
			s_Plus[j + 1] = s_Plus[j];
		s_Plus[0] = '-';
	}
	char* point = s_Plus;
	return point;
}
/////////////////////////////////////////////////////////////
struct Div BigDiv(char s[], char t[])
{
	char s1[M] = { 0 }, s2[M] = { 0 };
	strcpy(s1, s);  strcpy(s2, t);
	int i = 0, j = 0, m = 0, n = 0, k = 0, count = 0;
	memset(sr_Div, 0, sizeof(sr_Div));
	memset(count_Div, 0, sizeof(count_Div));
	count_Div[0] = '0';
	sr_Div[0] = '0';
	while (StringCmp(s1, s2) >= 0)
	{
		int len3 = 0, len4 = 0, lentemp = 0;
		char s3[M] = { 0 }, s4[M] = { 0 };
		char temp[M] = { '1' };
		strcpy(s4, s2);
		strcpy(s3, s1);
		while (StringCmp(s3, s4) >= 0) {
			len3 = strlen(s3);
			len4 = strlen(s4);
			lentemp = strlen(temp);
			s4[len4] = '0';
			temp[lentemp] = '0';
		}
		s4[len4] = 0;
		temp[lentemp] = 0;
		count--;
		BigMinus(s3, s4);
		strcpy(s1, s_Minus);
		for (i = 1; i <= count; i++) {
			temp[i] = '0';
		}
		BigPlus(temp, count_Div);
		strcpy(count_Div, s_Plus);
	}
	strcpy(sr_Div, s1);
	strcpy(point_Div.sr,sr_Div);
	strcpy(point_Div.count,count_Div);
	return point_Div;
}
////////////////////////////////////////////////////////
int StringCmp(char s[], char t[])
{
	char s1[M] = { 0 }, s2[M] = { 0 };
	strcpy(s1, s);  strcpy(s2, t);
	int i = 0, j = 0, m = 0, n = 0;
	n = strlen(s1);
	m = strlen(s2);
	if (s1[0] != '-' && s2[0] != '-') {
		if (n > m)
			return 1;
		else if (n < m)
			return -1;
		else if (n == m)
		{
			for (i = 0; i < n; i++)
			{
				if (s1[i] < s2[i])
					return -1;
				else if (s1[i] > s2[i])
					return 1;
			}
		}
	}
	else if (s1[0] == '-' && s2[0] == '-') {
		int len1 = strlen(s1);
		int len2 = strlen(s2);
		for (i = 1; i < len1; i++) {
			s1[i - 1] = s1[i];
		}
		for (i = 1; i < len2; i++) {
			s2[i - 1] = s2[i];
		}
		s1[len1 - 1] = 0;
		s2[len2 - 1] = 0;
		if (n > m)
			return -1;
		else if (n < m)
			return 1;
		else if (n == m)
		{
			for (i = 0; i < n; i++)
			{
				if (s1[i] < s2[i])
					return 1;
				else if (s1[i] > s2[i])
					return -1;
			}
		}
	}
	else if (s1[0] == '-' && s2[0] != '-') {
		return -1;
	}
	else if (s1[0] != '-' && s2[0] == '-') {
		return 1;
	}
	return 0;
}

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值