高精度算法

高精度算法

孤者浪人 提交于 2019-12-22 03:38:03
高精度算法 什么是高精度算法? 在我们的计算中,我们可能有长达几百位或者更多的数字进行加减乘除运算,我们在这里把这些整数称为高精度数,高精度算法就是用计算机对这些超大数据进行模拟加减乘除等运算。 高精度算法有什么用? 我们学完c后发现,int表示的数据范围是-2^31 ~ 2^32-1也就是[-2147483648,2147483657]这也就10位数字,我们最长的 long long int 也不过19位数字远远达不到几百位甚至更多的要求,这里如果要对这些数进行加减乘除等运算就需要用到高精度算法。 在这里,我简单介绍一下加法、减法和乘法: 我们知道,要进行高精度的运算的数字就很大,用long long 都可能存不下去,所以,我们想到了用字符存储的方法,就是把每一位数字都看做是一个字符,存储到字符串之中,然后我们通过“ 字符 – 48 = 数字 ”的这个ASCII码规律把每一位数字存入数组的每一位之中,我们就可以模拟运算了。 代码是这样的: char a [ 1001 ] , b [ 1001 ] ; int c [ 101 ] , d [ 101 ] ; cin >> a >> b ; int len1 = strlen ( a ) ; int len2 = strlen ( b ) ; for ( int i = 0 ; i < len1 ; i ++ ) c [ i ] =

数据结构课设:高精度算法

匿名 (未验证) 提交于 2019-12-03 00:18:01
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。 . 由于计算机运算是有模运算,数据范围的表示有一定限制,如整型int(C++中int 与long相同)表达范围是(-2^31~2^31-1),unsigned long(无符号整数)是(0~2^32-1),都约为几十亿.如果采用实数型,则能保存最大的double只能提供15~16位的有效数字,即只能精确表达数百万亿的数.因此,在计算位数超过十几位的数时,不能采用现有类型,只能自己编程计算。 ―― [ 百度百科 ] 题目 : ① 整数长度在一百位以上 ② 实现两长整数的加减乘除操作,除法要返回商和余数 ③ 输入输出均在文件中 高精度计算时一般用一个数组来存储一个数,数组的一个元素对应于数的一位(当然,在以后的优化中为了加快计算速度,也可用数组的一个元素表示数的多位数字),表示时

高精度算法

北城以北 提交于 2019-12-01 16:43:16
1.大数相加   1.1 思路:     数组模拟小学加法过程 就行     首先将 str1 ,str2 逆序 存入 a[ ],b[ ],c[ ] 记录结果     Max=( str1,str2 ) + 1     for 0 to Max-1       a[ i ] 加入,b[ i ] 加入       c[ i + 1 ] = c [ i ] /10; //进位       c[ i ] = c[ i ] %10;     end     删除前导零   1.2 代码模板: #include<iostream> #include<algorithm> #include<cstring> #include<string> using namespace std; int c[205],num; void Plus(string A,string B){ int a[205],b[205]; int sa=A.size(),sb=B.size(); num=max(sa,sb)+1; for(int i=0;i<sa;i++) a[i]=A[sa-i-1]-'0'; for(int i=0;i<sb;i++) b[i]=B[sb-i-1]-'0'; c[0]=0; for(int i=0;i<num;i++){ if(i<sa)c[i]+=a[i]; if(i<sb)c[i]

CSP考纲及高精度计算

江枫思渺然 提交于 2019-11-30 15:00:54
转载请注明出处,部分内容引自 SBSOI 大佬 转载请注明出处,部分内容引自 liusu201601 大佬 首先来一张图,很直观(截止到2012年数据) 下面是收集的一些,我改了一下 加粗表示特别重要,必须掌握 其他表示最好掌握,可能性不是很大,但是某些可以提高程序效率 高精度    a.加法    b.减法   c.乘法(应该只会有 高精乘单精 )   d.高精度除单精 (后面c,d考的可能性较小,应该只考a,b) 排序 算法   a.选择排序   b.插入排序   c.hash排序   d.归并排序(单纯的排序可能用不到,有快排就行了,但是归并排序的思想很重要)   e.堆排序    f.快排 字符串匹配算法    a.蛮力法   b.KMP 数论   a.欧几里德算法(用辗转相除法求最大公约数)   b.扩展欧几里德算法 ax+by=c 的正整数   c.素数 O(sqrt(n))   d.筛法求素数    e.快速乘方(位运算+同余+ 高精 ) 树论   a.二叉搜索树    b.优先队列(C++中priority_queue,相当于手动维护的小(大)根堆的 数据结构 优化)   c.线段树 (RMQ问题建议使用st算法)   d.平衡树一种(建议学习SBT) 图论    a.拓扑排序   b.割顶,割边(桥) {O(n)}   c.强连通分支 O(n)   d

基于类和对象的高精度算法封装

五迷三道 提交于 2019-11-27 13:58:48
高精度口诀(别问我这是从哪里来的,你在网上找不到是因为这就是我写的) :-) 1.高精度加法:相加进位再去零 2.高精度减法:判断相减再去零 3.高精度乘法:相乘预估再去零 4.高低精乘法:相乘进位再去零 #include<iostream> #include<cstring> using namespace std; class BIGINT{ public: int num[505]; int length; bool positive; BIGINT(string str=""){ memset(num, 0, sizeof(num)); positive = true; if(str == ""){ return; } else{ length = str.length(); for(int i = 0; i<str.length(); i++){ num[i] = str[str.length()-i-1]-'0'; } } } void show(){ if(positive == false){ cout<<"-"; } for(int i = length-1; i>=0; i--){ cout<<num[i]; } } }; int compare(BIGINT &a,BIGINT &b){ if(a.length > b.length){ return 1; }

高精度算法

给你一囗甜甜゛ 提交于 2019-11-27 09:46:20
虽然这玩意就是在考代码量qwq,但老是考还是要整理总结下。 一,什么是高精度 我们知道Int,longlong等都有一个最大精度,比如int 2147483647,有时我们需要计算的整形数字大小超过了longlong的精度, 所以我们就要用高精度进行计算。 二,高精度数的存储 通常我们用数组存储高精度数的每一位。 一般a[0]存储的是这个高精度数的位数。 a[1]存储的是这个这个高精度数的个位。 a[a[0]]存储的是这个高精度数的最高位。 读入方法: inline void init(int a[]) { char s[10005]; cin>>s; a[0]=strlen(s); for(int i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0'; return; } View Code 三,高精度加法 高精度计算的精髓在于模拟数学中的竖式,高精度加法模拟的就是竖式的加法运算。 我们设要计算的两个数组分别为a和b,结果存到数组c中。 加法就需要进位,如果某一位c[i]=a[i]+b[i]>=10了,那么c[i+1]++;c[i]-=10; 注意高精度计算常常要处理前导零。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 6 using