没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
数组型高精度数详解 By Nettle 2009-3-4
第 1 页 共 13 页
数组型高精度
数组型高精度数组型高精度
数组型高精度数
数数
数详解
详解详解
详解
By Nettle
数组型高精度数详解 By Nettle 2009-3-4
第 2 页 共 13 页
一、高精度简介
二、高精度数
三、高精度数与整型的运算
四、高精度数与高精度数的运算
五、高精度数的进制转换
六、高精度幂运算
七、压位高精度数
一
一一
一、
、、
、高精度简介
高精度简介高精度简介
高精度简介
首先要知道在计算机里面每一种数据类型都有自己的存储量。由于存储量的限制所以都有着各自的
精度,下面是一些常用数据类型的精度:
以 Pascal 为例
整型的精度就是在该类型范围内所有的数。
整型
范围
Shortint
-128 … 127
Integer
-32768 … 32767
Longint
-2147483648 … 2147483647
Int64
-9223372036854775808 … 9223372036854775807
Byte
0 … 255
Word
0 … 65535
Longword
0 … 4294967295
Qword
0 … 18446744073709551615
实型的精度是指当该类型的数据位数超过精度范围时自动对超过的部分进行四舍五入。比如将
1234567890123 存入 real 时就会变为 1.234568E12,后面的 890123 被四舍五入,只保留了位
数。
实型
范围 精度
real
2.9E-39 … 1.7E38
11 至 12
single
1.5E-45 … 3.4E38
7 至 8
double
5.0E-324 … 1.7E308
15 至 16
但是在某些计算中,参与运算的数的范围大大超出了标准数据类型(整型,实型)能表示的范围的
运算,例如求两个 100 位数的和的精确值。如果用一个整型变量,无论如何也是存储不了的,用实型则
会造成数据的不精确。
于是,我们想到了办法,将这个数字拆开,拆成一位一位的或者是四位四位的存储到一个数组中,
用一个数组去表示一个数字,这样表示的数字就被称为高精度数。
对于高精度数,也要像平常数一样做加减乘除以及乘方的运算,于是就有了高精度算法。
数组型高精度数详解 By Nettle 2009-3-4
第 3 页 共 13 页
二
二二
二、
、、
、高精度数
高精度数高精度数
高精度数
[
[[
[高精度数的定义
高精度数的定义高精度数的定义
高精度数的定义]
]]
]
高精度数事实上就是一个整型数组,根据题目中用的数据的位数设定数组的大小。为了方便通常将高精度数
创建为一个新类型,如下:
C++ Pascal
typedef int hp[250];
type
hp = array [0..250] of integer;
此时 hp a 或 a: hp 就表示 a 为 hp 类型即大小为 250 的 int 数组。
在本文中 a[0]将存储高精度数的位数,而从 a[1]到 a[a[0]]分别从低位到高位存储高精度数的每一位
数(这样每当一位超过 9 时,会向前一进位的高精度数,为十进制高精度数)。未使用的部分均为 0。
例如将 123456789012 存入 a 中为
数组下标
0
1
2
3
4
5
6
7
8
9
10
11
12
13
…
存储数据
12
2
1
0
9
8
7
6
5
4
3
2
1
0
0
则 a 表示一个 12 位数,从右至左分别为 210987654321。
[
[[
[高精度
高精度高精度
高精度数
数数
数的读入
的读入的读入
的读入]
]]
]
高精度数一般采用字符串的方式,也可以采用字符的方式(以回车符作为结束的标志)。非读入型的高精度
数,同常赋值为 a[0] = a[1] = 1 (多用于乘法)或 a[0] = 1, a[1] = 0(多用于加减)下面为字符串
式的读入(十进制):
字符串,特别说明 C++里字符串以下标 0 开始,Pascal 以 1 开始。
C++ Pascal
void Init(hp &a)
{
string s;
int l;
memset(a, 0, sizeof(a)); //清零
cin >> s;
l = s.size(); //得到数的位数
for (int i = l; i >= 1; i--)
a[i] = s[l - i] - '0';
a[0] = l;
return ;
}
procedure Init(var a: hp);
var
s: string;
l, i: integer;
begin
fillchar(a, sizeof(a), 0); //清零
readln(s);
l = length(s);
for i := l downto 1 do
a[i] := ord(s[l – i + 1]) – ord('0');
a[0] := l;
end;
[
[[
[高精度进位
高精度进位高精度进位
高精度进位]
]]
]
当 a[i]上的数据大于等于 10 的时候,就要向高位进位了。因为该数组中下标越大,位数越高,故对 a[i]
位进行进位的操作为:
剩余12页未读,继续阅读
资源评论
wangweinoo1
- 粉丝: 2
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功