1.目的:
有时候处理非常大的数字时怎么办呢?这个时候就需要高精度算法,用字符串模拟整数运算。
2.加:
#include<iostream>
#include<string>
using namespace std;
int a[500], b[500];//数组大小决定数字长度
int main()
{
string str1, str2;
cin >> str1 >> str2;
int l1 = str1.size(), l2 = str2.size();
for (int i = 1;i <= l1;i++)
{
a[i] = str1[l1 - i]-'0';
}
for (int i = 1;i <= l2;i++)
{
b[i] = str2[l2 - i]-'0';
}
if (l1 < l2)
l1 = l2;
for (int i = 1;i <= l1;i++)
{
a[i] += b[i];
a[i + 1] += a[i] /10;
a[i] %= 10;
}
l1++;
if (a[l1] == 0 && l1 > 1) l1--;//判断是否进位
for (int i = l1;i > 0;i--)
{
cout << a[i];
}
return 0;
}
3. 减:
- 减法比加法复杂,需先判断两个数大小
int compare(string s1, string s2)
{
if (s1.size() > s2.size()) return 1;
else if (s1.size() < s2.size()) return 0;
else
{
if (s1 >= s2) return 1;
else return 0;
}
}
3.1整体代码:
#include<iostream>
#include<string>
using namespace std;
int compare(string s1, string s2)
{
if (s1.size() > s2.size()) return 1;
else if (s1.size() < s2.size()) return 0;
else
{
if (s1 >= s2) return 1;
else return 0;
}
}
int main()
{
string str1, str2;
int a[250], b[250], len;
int i;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
cin >> str1 >> str2;
a[0] = str1.length();
for (i = 1;i <= a[0];i++)
a[i] = str1[a[0] - i] - '0';
b[0] = str2.length();
for (i = 1;i <= b[0];i++)
b[i] = str2[b[0] - i] - '0';
if (compare(str1, str2))//大于等于
{
for (int i = 1;i <= a[0];i++)
{
a[i] -= b[i];
if (a[i] < 0) { a[i + 1]--; a[i] += 10; }
}
a[0]++;//可有可无吧
while (a[a[0]] == 0 && a[0] > 1) a[0]--;
for (int i = a[0];i > 0;i--)
cout << a[i];
}
else
{
cout << "-";
for (int i = 1;i <= b[0];i++)
{
b[i] -= a[i];
if (b[i] < 0) { b[i + 1]--; b[i] += 10; }
}
b[0]++;//可有可无吧
while (b[b[0]] == 0 && b[0] > 1) b[0]--;
for (int i = b[0];i > 0;i--)
cout <<b[i];
}
return 0;
}
4.乘:
#include<iostream>
#include<string>
using namespace std;
int a[2500], b[2500],c[2500];
int main()
{
string str1, str2;
cin >> str1 >> str2;
a[0] = str1.size(), b[0] = str2.size();
for (int i = 1;i <= a[0];i++)//逆序存放
a[i] = str1[a[0] - i] - '0';
for (int i = 1;i <= a[0];i++)
b[i] = str2[b[0] - i] - '0';
for(int i=1;i<=a[0];i++)
for (int j = 1;j <= b[0];j++)
{
c[i + j - 1] += a[i] * b[j];
c[i + j] += c[i + j - 1] / 10;
c[i + j - 1] %= 10;
}
int len = a[0] + b[0] + 1;
while (c[len] == 0 && len > 1) len--;
for (int i = len;i > 0;i--)
cout << c[i];
return 0;
}
补充:高精度除法待补充,如果有好方法,欢迎
在评论区补充🤞🤞🤞💕