当前位置:首页 > 算法 > 正文内容

【算法】高精度(1)

亿万年的星光4年前 (2021-05-02)算法1649

一、  什么是高精度

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


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【分治】----快速幂

【分治】----快速幂

1.幂幂(power)是指乘方运算的结果。n^m指该式意义为m个n相乘。把n^m看作乘方的结果,叫做n的m次幂,也叫n的m次方。2.幂的数学表示和规则2^3  *   2...

【贪心】----最优装载、背包、乘船问题

【贪心】----最优装载、背包、乘船问题

1.最优装载题目描述:有n个物体,第i个物体的重量为wi(wi为正整数)。选择尽量多的物体,使得总重量不超过C。【分析】由于只关心选择的物品的最大数量(而不是最大重量,最大重量需要考虑DP),所以装重...

【贪心】区间覆盖

【贪心】区间覆盖

【题目描述】给定一个长度为m的区间,再给出n条线段的起点和终点(本题考虑闭区间),求最少使用多少线段可以将整个区间完全覆盖。【输入】第一行是区间长度m。第二行是n,表示有n个可选区间。后面跟着n行数据...

【算法】二分法—最大化平均值问题简单总结

0.前言通过几道题目 切割钢管、木材加工、切割绳子、均分蛋糕 四道题,尝试了二分法中最大化平均值问题。然后,下面进行简单的对比和总结。1.简单总结while(l < ...

【排序】----冒泡排序

【排序】----冒泡排序

1.基本思想两个数比较大小,较大的数下沉,较小的数冒起来。2.过程·每次比较相邻的两个数,如果第二个数小,就交换位置。(升序或降序)·然后两两比较,一直到比较最后的数据。最终最小(大)数被交换到开始(...

【算法】滑动窗口1—窗口大小固定

【算法】滑动窗口1—窗口大小固定

一、定义滑动窗口算法(Sliding Window Algorithm)是一种用于解决数组或字符串中子数组或子串问题的优化技术。它通过维护一个窗口(通常是数组或字符串的一个连续子区间),在遍历过程中动...