Sowu高精度详解

前言:在说高精度加减乘除运算之前,我们先搞明白什么是高精度运算?

利用计算机进行数值计算,有时会遇到这样的问题:有些计算要求精度高,希望计算的数的位数可达几十位甚至几百位,虽然计算机的计算精度也算较高了,但因受到硬件的限制,往往达不到实际问题所要求的精度。我们可以利用程序设计的方法去实现这样的高精度计算。

以下是几种常见数据类型的范围:

变量 范围
int -2147483648 ~ +2147483647 (4 Bytes)
char -128 ~ +127 (1 Byte)
double 1.7 * 10^308 (8 Bytes)
long long -9223372036854775808 ~ +9223372036854775807 (8 Bytes)
unsigned long long 0~18446744073709551615

简单说高精度就是处理要算的数太大或太小,没法直接储存计算的问题

其实高精度计算并不困难,只要需要处理好以下几个问题即可:
(1)数据的接收方法与位数的确定
(2)数据的存贮方法
(3) 进位,借位处理
(4) 商和余数的求法

(1)数据的接收方法与位数的确定:

当输入的数很大时,可采用字符串或者字符数组方法输入数据。前者我们用.size确定位数,后者采用strlen的方式确定位数
1、scanf读入字符串

#include
#include
#include
#include
using namespace std;
int main()
{
	char a[2020],b[2020]; //要定义char类型 
	scanf("%s%s",&a,&b);   //  & 可省略 
	cout<<a<<" "<<b<<'\n';
	int lena = strlen(a);  //计算长度
	int lenb = strlen(b);
	cout<<lena<<" "<<lenb;
} 

2、gets读入字符串

	char a[2020],b[2020]; //要定义char类型 
	gets(a);gets(b);
	cout<<a<<" "<<b<<'\n';
	int lena = strlen(a);
	int lenb = strlen(b);
	cout<<lena<<" "<<lenb;

3、cin读入字符串

	string a,b;  
	cin>>a>>b;
	cout<<a<<" "<<b<<'\n';
	cout<<a.size()<<" "<<b.size();

scanf、cin遇空格或回车符则认为当前字符串结束
gets遇回车符则认为当前字符串结束

(2)数据的存贮方法:

关于数据的储存,我们可以利用字符串函数和操作运算,将每一位数取出,存入数组中

	string a; 
	int num[2020]; 
	cin>>a;
	int lena = a.size();
	for(int i = 1;i <= lena;i ++)
		num[i] = a[i - 1] - '0';
	for(int i = 1;i <= lena;i ++)
		cout<<num[i];
(3) 进位,借位处理

加法进位:

	a[i] += b[i] + c[i];
	if(a[i] >= 10)
	{
		a[i + 1] ++;
		a[i] %= 10; 
	} 

减法借位:

	a[i] += b[i] - c[i];
	if(a[i] < 0)
	{
		a[i + 1] --;
		a[i] += 10; 
	} 

乘法进位:

	a[i + j - 1] += a[i] * b[j];
	if(a[i] > 10)
	{
		a[i + 1] += a[i] / 10;
		a[i] %= 10; 
	} 
(4) 商和余数的求法

数据较小时高精除可以用减法来模拟除法,对被除数的每一位都减去除数,一直减到被除数小于除数,运算次数为商,剩余的被除数为余数

数据较大时

待添加

模板:
高精度加法(必做) :https://www.luogu.com.cn/problem/P1601
高精度减法(必做) :https://www.luogu.com.cn/problem/P2142
高精度乘法(必做):https://www.luogu.com.cn/problem/P1303
高精度除法 (选做):https://www.luogu.com.cn/problem/P5432
高精度开跟 (选做): https://www.luogu.com.cn/problem/P2293
高精求小数幂(选做):https://www.luogu.com.cn/problem/P1517

待添加

好题:

B进制 (选做):https://www.luogu.com.cn/problem/P1604

待添加

模板及详解:

待添加

编写人:

  1. Sowu_lion

你可能感兴趣的:(高精度)