自己写了一份大数运算头文件,上传以备忘,也欢迎大佬提出意见。
#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