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

【算法】高精度(1)

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

一、  什么是高精度

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


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

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

分享给朋友:

相关文章

【贪心】区间覆盖

【贪心】区间覆盖

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

【贪心】----找零钱问题

一、找零钱问题例题1:有 1 元,5元,10元,20元,100元,200元的钞票无穷多张。现在使用这些钞票支付X元,最少需要多少张钞票。X = 628最佳支付方法:3张200块的,1张20块的,1张5...

【排序】----插入排序

【排序】----插入排序

1.基本思想在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。2.过程·(1)从第一个元素开始,该元素可以...

【贪心】区间调度

【贪心】区间调度

【题目描述】有n项工作,每项工作分别在si时间开始,在ti时间结束。对于每项工作,你都可以选择参与与否。如果选择了参与,那么自始至终都必须全程参与。此外,参与工作的时间段不能重叠(即使是开始与结束的瞬...

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

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

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

【算法】归并排序

【算法】归并排序

一、基本思想归并排序的核心思想是将两个已经有序的子序列合并成一个有序序列。整个过程分为两个主要步骤: 1.分解:将待排序的序列不断二分,直到每个子序列只包含一个元素(此时自然有序) ...