“天意终究难参,假若登顶成憾,与|

zsdqwq

园龄:3年6个月粉丝:9关注:17

高精度板子

本章即将介绍的是一章高精度的板子,并没有深奥的道理,大函数大 inline 者,暂且靠边站,笔者没有那么高水平,满足不了这些需求。本文如有理念上与逻辑上的错误,请多多包涵并且指出。

Part-1

什么是高精度?

高精度,虽然听起来感觉很生熟,很深奥,但是,原理不过是小学二三年级时的加减法竖式和四五年级的乘法算式罢了,也就是说,你如果将高精度的具体过程列出来,其实,就是一张你小学时的竖式,怎么样,并不是很难吧

高精度问题怎么做?

当然,上述讲过了,高精度还有 inline ,但我们暂且不提,以后会有一张专门讲进阶的。当然,简单的高精度算法,其实用 Excel 表格已经完美诠释

举个例子,如下,我们用32和99来做高精度的加、减、乘、除的过程:

上图为减法的过程;

上图为加法的过程;

上图为乘法过程;

除法过程其实跟乘法什么的没什么区别,这里偷一下懒,懒得写了 QAQ

Part-2

高精度加法的代码

代码上都有注释,应该没什么阅读上的障碍吧(

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int a[1005], b[1005], c[1005];
int lens1, lens2, len;
void add(int a[], int b[]) {
	//计算
	memset(c, 0, sizeof(c));//必须要初始化,不然就会有随机数
	len = lens1 > lens2 ? lens1 : lens2;
	int g = 0;//g是进位
	for (int i = 1; i <= len; i++) {
		c[i] = a[i] + b[i] + g;
		g = c[i] / 10;
		c[i] %= 10;
	}
	if (g != 0) c[++len] = g;
	c[0] = len;
	for (int i = len; i >= 1; i--) cout << c[i];
}
int main() {
	//string s1, s2;
	string s1;
	cin >> s1;
	lens1 = s1.size();
	for (int i = 0; i < lens1; i++) {
		//按照反着的顺序,输入
		a[lens1 - i] = s1[i] - '0';
	}
	string s2;
	cin >> s2;
	lens2 = s2.size();
	for (int i = 0; i < lens2; i++) {
		//按照反着的顺序,输入
		b[lens2 - i] = s2[i] - '0';
	}
	add(a, b);
	cout << endl;
	return 0;
}

高精减

同加法(同理不说了)

高精乘

#include<iostream>
using namespace std;
int a[2000];
int b[2000];
int c[2000];
int sum[2000];
void pplus(int *a,int *c)
{
	int jw=0;
	for(int i=1;i<=1000;i++)
	{
		c[i]+=a[i]+jw;
		jw=c[i]/10;
		c[i]%=10;
	}
}
void cheng(int *a,int c)
{
	int jw=0;
	for(int i=1;i<=1000;i++)
	{
		a[i]=a[i]*c+jw;
		jw=a[i]/10;
		a[i]%=10;
	}
}
int main()
{
	int n;
	cin>>n;
	a[1]=1;
	for(int i=1;i<=n;i++)
	{
		cheng(a,i);
		pplus(a,c);
	}
	bool flag=0;
	for(int i=1000;i>=1;i--)
	{
		if(c[i]!=0) flag=1;
		if(flag) cout<<c[i];
	}
}

高精度除

唉,打数组打得那么累了,直接来一个快读快输吧 qwq

char c=getchar();
while (c>='0' && c<='9')
{
	len++;
	a[len]=(c-'0');
	c=getchar();	
}

核心代码

其他没什么区别 qwq

感谢观看,期待下次的再见

本文作者:zsdqwq

本文链接:https://www.cnblogs.com/wo-de-bo-ke-wo-zuo-zhu/p/15827987.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   zsdqwq  阅读(213)  评论(1编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示