高精度数的存储
定义
虽然被称为高精度,但这与 double
和 float
类型没有直接关系。高精度主要指的是那些超出原生数据类型(如 int
、long
)存储范围的数。(比如 int
和 long long
都装不下)。这些数可以非常大,需要特殊的数据结构和算法来处理。
存储
既然要处理大数,首先需要考虑的是如何存储这个数字。由于普通数据类型无法满足需求,我们可以通过拆分数字来实现存储。例如,将 123456
拆分成 1, 2, 3, 4, 5, 6
。
存储方法
为了存储这些拆解后的数字,我们可以使用数组。这里讨论两种常见的数据类型:int
和 char
。
- char 类型数组:输入方便,可以直接使用
cin
,但运算时需要将char
类型转换为int
类型。 - int 类型数组:输入需要使用
for
循环,但可以直接进行运算。
两种数组各有优缺点,因此可以结合使用。
实现步骤
- 定义
char
数组存储高精度数。 - 输入高精度数。
- 将
char
型字符转换为int
型。 - 输出转换后的数。
代码示例
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char a[1001] = {}; // 定义char数组用以存储数据
int a1[1001] = {}; // 定义int数组,用以存储转换后的数组
cin >> a; // 输入高精度数
int lena = strlen(a); // 求出大数的长度
for(int i = 0; i < lena; i++){
a1[i] = a[i] - '0'; // 将char型字符转换为int数字
cout << a1[i]; // 输出大数
}
return 0;
}
题目练习
题目描述
求大数的首末位:输入一个长度不超过 100 的高精度数 a
,求出这个大数的长度以及首位和末位并输出。
输入格式
一行,表示这个高精度数 a
。
输出格式
一行,有三个数,以空格分开。分别表示 a
的长度、首位数字以及末位数字。
样例输入
1231231231246534646536
样例输出
22 1 6
代码实现
#include <bits/stdc++.h>
using namespace std;
int main(){
char a[1001] = {0};
int a1[1001] = {0};
cin >> a;
int len = strlen(a);
cout << len << " " << a[0] << " " << a[len-1] << endl;
return 0;
}