高精度算法详解
- 1.前言
- 2.内容
- 1.高精度加法
- 1.用普通数组实现
- 2.用结构体实现
- 2.高精度减法
- 3.高精度乘法
- 4.高精度除法(高精度/低精度)
- 5.高精度除法(高精度/高精度)
- 3.总结
- 4.更新日志
1.前言
近期学习了高精度的相关算法,现整理如下,最重要的是要理解算法的本质:模拟实现平时的竖式计算过程
补充相关习题链接,欢迎学习后练习:
2.内容
直接开始学习之路吧~~
1.高精度加法
1.用普通数组实现
using namespace std; // 高精度加法
char a[505], b[505];
int m[505], n[505];
int main()
{
cin >> a >> b;
int len1 = strlen(a);
int len2 = strlen(b);
//1.转换为字符并逆序存储
for (int i = len1 - 1, j = 1; i >= 0; i--, j++)
m[j] = a[i] - '0';
for (int i = len2 - 1, j = 1; i >= 0; i--, j++)
n[j] = b[i] - '0';
int len = max(len1, len2);
//相加
for (int i=1; i <= len; i++)
{
m[i]+= + n[i];
m[i + 1] += m[i] / 10; //考虑进位
m[i] %= 10;
}
//考虑前导0
if (m[len + 1]) //第一位是否为0
cout << m[len +1];
else
while (m[len] == 0 && len> 1)
len--;
for (int j = len; j >= 1; j--)
cout << m[j];
return 0;
}
2.用结构体实现
using namespace std; //2.方法2 用结构体
struct Hugeint { //大整型结构体(有必要初始化)
int num[505] = {0}; //存数字
int len = 0; //存长度
};
Hugeint strtoint(string a)
{
Hugeint ans;
//补充 .length()只可获取字符串长度 .size()除此之外,还可获取vector长度
for (int i = a.length() - 1; i >= 0; i--)
ans.num[++ans.len] = a[i]-'0'; //下标从1开始,逆序存储数组
return ans;
}
Hugeint add(Hugeint m, Hugeint n)
{
Hugeint ans;
ans.len = max(m.len, n.len);
for (int i = 1; i <= ans.len; i++)
{
ans.num[i] += m.num[i] + n.num[i]; //相加存储到ans
ans.num[i + 1] += ans.num[i] / 10; //大于10进位
ans.num[i] %= 10; //留下余数
}
//处理进位溢出
if (ans.num[ans.len + 1] > 0) //如果最后一位的下一位有数字,说明进位了,则扩大ans.len
ans.len++;
return ans;
}
void print(Hugeint z)
{
for (int i = z.len; i >= 1; i--) //与上面逆序存储保持一致
{
cout << z.num[i];
}
}
int main()
{
//1.先当成字符串输入
char a[505], b[505];
cin >> a >> b;
//2.将a b字符串里的元素转换为int类型,并存储到m.num
Hugeint m = strtoint(a);
Hugeint n = strtoint(b);
//3.将m,n中的数据相加(注意处理进位溢出)
Hugeint z = add(m, n);
//4.逆序打印
print(z);
return 0;
}
2.高精度减法
3.高精度乘法
4.高精度除法(高精度/低精度)
5.高精度除法(高精度/高精度)
3.总结
4.更新日志
2022.5.12 整理上传高精度加法
欢迎评论留言、指正~~