数据结构算法(0)--大数运算
总结并记录学习数据结构过程中遇到的问题及算法.
一些常见算法:
Note:
- 大数四则运算.
加法
#include <iostream>
#include<string>
#include<stdio.h>
using namespace std;
#define MAXSIZE 1000
int num1[MAXSIZE], num2[MAXSIZE];
void sum(char a[], char b[])
{
int len1 = strlen(a);
int len2 = strlen(b);
int i, j;
int lensum = len1 > len2 ? len1 : len2; //总计算长度
lensum++;
for (i = len1 - 1, j = 0; i >= 0; --i) //逆序存储
{
num1[j++] = a[i] - '0';
}
for (i = len2 - 1, j = 0; i >= 0; --i)
{
num2[j++] = b[i] - '0';
}
for (i = 0; i < lensum; ++i)
{
int temp = num1[i] + num2[i];
num1[i] = temp % 10;
num1[i + 1] += temp / 10;
}
for (i = lensum - 1; i >= 0 && num1[i] == 0; --i); //去除前置0
if (i >= 0)
{
for (; i >= 0; --i)
cout << num1[i];
}
else
cout << 0;
cout << endl;
}
int main()
{
char a[MAXSIZE], b[MAXSIZE];
int i, j;
cin >> a >> b;
sum(a, b);
system("pause");
}
减法
#include <iostream>
#include<string>
#include<stdio.h>
using namespace std;
#define MAXSIZE 1000
int num1[MAXSIZE], num2[MAXSIZE];
bool myStrcmp(const char str1[], const char str2[])
{
if (strlen(str1) > strlen(str2))
return true;
if (strlen(str1) == strlen(str2))
return strcmp(str1, str2) >= 0;
return false;
}
void sum(char a[], char b[])
{
int len1 = strlen(a);
int len2 = strlen(b);
int i, j;
int lensum = len1 > len2 ? len1 : len2; //总计算长度
lensum++;
for (i = len1 - 1, j = 0; i >= 0; --i) //逆序存储
{
num1[j++] = a[i] - '0';
}
for (i = len2 - 1, j = 0; i >= 0; --i)
{
num2[j++] = b[i] - '0';
}
for (i = 0; i < lensum; ++i)
{
num1[i] -= num2[i];
if (num1[i] < 0)
{
num1[i] += 10;
num1[i + 1]--;
}
}
for (i = lensum - 1; i >= 0 && num1[i] == 0; --i); //去除前置0
if (i >= 0)
{
for (; i >= 0; --i)
cout << num1[i];
}
else
cout << 0;
cout << endl;
}
int main()
{
char a[MAXSIZE], b[MAXSIZE];
int i, j;
cin >> a >> b;
bool sign = myStrcmp(a, b);
if (sign)
{
sum(a, b);
}
else
{
cout << '-';
sum(b, a);
}
system("pause");
}
乘法
#include <iostream>
#include<string>
#include<stdio.h>
using namespace std;
#define MAXSIZE 1000
int num1[MAXSIZE], num2[MAXSIZE], num3[MAXSIZE*3];
void sum(char a[], char b[])
{
int len1 = strlen(a);
int len2 = strlen(b);
int i, j;
int lensum = len1 + len2 +1; //总计算长度
for (i = len1 - 1, j = 0; i >= 0; --i) //逆序存储
{
num1[j++] = a[i] - '0';
}
for (i = len2 - 1, j = 0; i >= 0; --i)
{
num2[j++] = b[i] - '0';
}
for (i = 0; i < len1; ++i) //计算
{
for (j = 0; j < len2; ++j)
{
num3[i + j] += num1[i] * num2[j];
}
}
for (i = 0; i < lensum; ++i) //处理进位
{
if (num3[i] >= 10)
{
num3[i + 1] += num3[i] / 10;
num3[i] %= 10;
}
}
for (i = lensum - 1; i >= 0 && num3[i] == 0; --i); //去除前置0
if (i >= 0)
{
for (; i >= 0; --i)
cout << num3[i];
}
else
cout << 0;
cout << endl;
}
int main()
{
char a[MAXSIZE], b[MAXSIZE];
int i, j;
cin >> a >> b;
sum(a, b);
system("pause");
}
除法