自学内容网 自学内容网

c++高精度

高精度是什么

计算数据过大超过long long的数据范围时,需要引进高精度算法。将数一位一位的存在数组中输出。

高精度加法

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
char a1[10000], b1[10000];//字符存储数字
int a[10000], b[10000], c[10000];//存储相加结果
int len_a, len_b, len_c = 1, x, i;

memset(a, 0, sizeof(a));//清零
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));

cin >> a1 >> b1;//输入两个加数

len_a = strlen(a1);//计算字符串长度
len_b = strlen(b1);

for (i = 0; i < len_a; i++)a[len_a - i] = a1[i] - '0';//将加数存在a数组
for (i = 0; i < len_b; i++)b[len_b - i] = b1[i] - '0';//将另一个数存在b数组

x = 0;//x为进位
while (len_c <= len_a || len_c <= len_b)
{
c[len_c] = a[len_c] + b[len_c] + x;//两数相加,再加上前两个数进位的
x = c[len_c] / 10;
c[len_c] %= 10;
len_c++;//位数++
}
c[len_c] = x;
if (c[len_c] == 0)//判断首位是否为0
{
len_c--;//位数--
}

//输出每一位
for (int i = len_c; i >= 1; i--)
{
cout << c[i];
}

return 0;
}

高精度减法

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
char a1[10000], b1[10000];//字符存储数字
int a[10000], b[10000], c[10000];//存储相减结果
int len_a, len_b, len_c = 1, x, i;

memset(a, 0, sizeof(a));//清零
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));

cin >> a1 >> b1;//输入

len_a = strlen(a1);//计算字符串长度
len_b = strlen(b1);

for (i = 0; i < len_a; i++)a[len_a - i] = a1[i] - '0';
for (i = 0; i < len_b; i++)b[len_b - i] = b1[i] - '0';

i = 1;
while (i <= len_a || i <= len_b)
{
if (a[i] < b[i])
{
c[i] = a[i] + 10 - b[i];
a[i + 1]--;//借位
}
else
{
c[i] = a[i] - b[i];
}
i++;
}
len_c = i;
while (c[len_c] == 0 && len_c > 1)
{
len_c--;
}

//输出每一位
for (int i = len_c; i >= 1; i--)
{
cout << c[i];
}

return 0;
}

高精度乘法

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
char a1[10000], b1[10000];//字符存储数字
int a[10000], b[10000], c[10000];//存储相减结果
int len_a, len_b, len_c = 1, x, i, j;

memset(a, 0, sizeof(a));//清零
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));

cin >> a1 >> b1;//输入

len_a = strlen(a1);//计算字符串长度
len_b = strlen(b1);

for (i = 0; i < len_a; i++)a[len_a - i] = a1[i] - '0';
for (i = 0; i < len_b; i++)b[len_b - i] = b1[i] - '0';

for (i = 1; i <= len_a; i++)
{
x = 0;
for (j = 0; j <= len_b; j++)
{
c[i + j - 1] += x + a[i] * b[i];
x = c[i + j - 1] / 10;//进位
c[i + j - 1] %= 10;
}
c[i + len_b] = x;//进位的数
}
len_c = len_a + len_b;
while (c[len_c] == 0 && len_c > 1)
{
len_c--;
}



//输出每一位
for (int i = len_c; i >= 1; i--)
{
cout << c[i];
}

return 0;
}

 


原文地址:https://blog.csdn.net/weixin_63201442/article/details/136308151

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!