高精度(入门篇!)

本文介绍了高精度算法的基础知识,包括如何存储高精度数和实现加减乘除运算。通过字符串表示高精度数,采用竖式运算的方法详细解释了加法、减法、高精度乘法(包括低精度乘法和高精度乘法)及除法的处理过程,适合初学者入门学习。
摘要由CSDN通过智能技术生成

定义:

高精度算法High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方阶乘开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。——百度百科

引入:

实现一个计算器能够计算+-*/四种运算,且计算的数可以超出long long的范围。

存储:

在平常的实现中,高精度数字利用字符串表示,每一个字符表示数字的一个十进制位。因此可以说,高精度数值计算实际上是一种特别的字符串处理。

读入字符串时,数字最高位在字符串首(下标小的位置)。但是习惯上,下标最小的位置存放的是数字的 最低位,即存储反转的字符串。这么做的原因在于,数字的长度可能发生变化,但我们希望同样权值位始终保持对齐。

此后我们将一直沿用这一约定。定义一个常数 LEN = 1004 表示程序所容纳的最大长度。

简单实现:

void clear(int a[]){
	for(int i=0;i<LEN;i++) a[i]=0;
}
void read(int a[]){
	char s[LEN+1];
	scanf("%s",s);
	clear(a);
	int len_s=strlen(s);
	// 如上所述,反转
	for(int i=0;i<len_s;i++) a[len_s-i-1]=s[i]-'0';
	// s[i] - '0' 就是 s[i] 所表示的数码
}

输出也按照存储的逆序输出。由于不希望输出前导零,故这里从最高位开始向下寻找第一个非零位,从此处开始输出;终止条件 i >= 1 而不是 i >= 0 是因为当整个数字等于 0 时仍希望输出一个字符 0

void print(int a[]){
	int i;
	for(i=LEN-1;i>=1;i--) 
		if(a[i]!=0) break;
	for(;i>=0;i--) putchar(a[i]+'0');
	putchar('\n');
}

拼起来就是一个完整的复读机程序咯。

#include<bits/stdc++.h>

using namespace std;
const int LEN=1004;
int a[LEN],b[LEN];
void clear(int a[]){
	for(int i=0;i<LEN;i++) a[i]=0;
}
void read(int a[]){
	char s[LEN+1];
	scanf("%s",s);
	clear(a);
	int len_s&#
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值