【算法】高精度(1)
一、 什么是高精度
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,我们可以将这个数字拆开,拆成一位一位的,或者是几位几位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。说白了,高精度计算就是解决long long也解决不了的问题。
二、 高精度的作用
正如上面所说的,高精度的作用就是对于一些异常之大的数字进行加减乘除乘方阶乘开方等运算。比如给你一道a+b的题目,读入a和b,让你输出它们的和,但a和b的范围都是小于等于10的6666次方,这个时候你就只能用高精度了。
三、高精度的输入和输出
当一个数据很大的时候,我们用一个整数类型是存不下的,所以我们可以先用一个字符串输入,这样就可以输入很长的数,然后再利用字符串函数和操作运算,将每一位数取出,存入一个数组里,我们用数组里的每一位表示这个数的每一个数位。(一个数组表示一个数)
例如:998244353用数组储存下来,a{3,5,3,4,4,2,8,9,9},一般是倒着存(从低位到高位,因为整数没有除个位以下的数位,但你的最高位还可以进位,那么你就又要开一个位置来存这个新的最高位)。
例如: 1 2 3 4 千 百 十 个
数组的正常表示: a[1] a[2] a[3] a[4]
---------------------------------------------------------------------------------------
a[4] a[3] a[2] a[1]
下标大 下标小
1 2 3 4
最高位 最低位 倒序存储
---------------------------------------------------------------------------------------
a[1] a[2] a[3] a[4]
下标小 下标大
1 2 3 4
最高位 最低位 正序存储
---------------------------------------------------------------------------------------
输入:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char s[6666]; int a[6666]; int main() { //输入 scanf("%s",s); //或cin>>s; int len =strlen(s); //这个数的长度 for(int i=1;i<=len; i++) a[i]=s[len-i] -'0'; //将字符串s转换成数组a,并倒序存储 // 等价于 a[i]=s[len-i]-48 return 0; }
输出:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char s[6666]; int a[6666]; int main() { //输入 scanf("%s",s); //或cin>>s; int len =strlen(s); //这个数的长度 for(int i=1;i<=len; i++) a[i]=s[len-i] -'0'; //将字符串s转换成数组a,并倒序存储 // 等价于 a[i]=s[len-i]-48 for(int i=len;i>0;i--) printf("%d",a[i]);// 一位一位的输出 return 0; }
四、高精度比较大小
处理完数据之后,假设我们要比较两个数那个大怎么办呢?
我们先模拟比较1314520和1314530,首先我们看两个数的长度(即len1和len2)如果哪个数的len更长一点,那么这个数肯定要比另一个数大,否则我们才继续比较下去,这里两个数的长度是一样的,所以接下来我们就看这两个数的最高位(即1和1),相等,则继续比较下一位(3和3),也一样,继续比较下一位......直到比到十位的时候(2和3),因为2<3,所以第一个数<第二个数,直接退出。
所以,高精度比较大小的步骤大致如下:
1、比较两个数的长度,长度更长的数越大。
2、如果两个数长度相等,那么就从高位到低位一位一位比较,如果某一位数字不同时,较大的数大。否则继续比较下一位。
3、如果比到最后都没有比出谁大谁小,就说明这两个数一样大。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; //比较a和b的大小,如果a>b则返回真,否则返回假 int a[6666],b[6666]; int compare(){ int lena=strlen(a); int lenb=strlen(b); if(lena>lenb) return 1;//lena表示a这个数的长度,lenb则表示b的长度 if(lenb>lena) return 0;//步骤1 for(int i=lena;i>0;i--){//从高位到底位一位一位比较 if(a[i]>b[i]) return 1; if(b[i]>a[i]) return 0; }//步骤2 return 0;//步骤3,a=b,即a不大于b }
扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。