高精度算法

【模版】高精度算法

强颜欢笑 提交于 2020-03-29 10:11:43
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 const int power=4; 6 const int base=1e4; 7 const int maxn=2e3+5; 8 9 struct num{ 10 int a[maxn<<1]; 11 12 num(){memset(a,0,sizeof(a));} 13 int &operator [](int x){return a[x];}//重载中括号 14 num(char *s,int len){ 15 memset(a,0,sizeof(a)); 16 17 a[0]=(len+power-1)/power; 18 19 for(int t=0,w=1,i=len-1;i>=0;w=(w<<1)+(w<<3),--i){ 20 if((len-1-i)%power==0) w=1,++t; 21 a[t]+=(s[i]^48)*w;//注意+= 22 } 23 } 24 void add(int k) { if (k || a[0]) a[ ++a[0] ] = k; } //在末尾添加一个数,除法的时候要用到 25 void re() { reverse(a+1, a+a[0]+1); } 26 void print(){ 27 printf("%d"

高精度 阶乘

倖福魔咒の 提交于 2020-02-29 12:29:03
问题描述 输入一个正整数n,输出n!的值。   其中n!=1 2 3*…*n。 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。   将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。   首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。 输入格式 输入包含一个正整数n,n<=1000。 输出格式 输出n!的准确值。 样例输入 10 样例输出 3628800 代码 # include <iostream> using namespace std ; const int maxn = 1000 ; int main ( ) { int a [ maxn ] = { 0 } ; a [ 0 ] = 1 ; int n ; int l , c ; scanf ( "%d" , & n ) ; for ( int i = 2 ; i <= n ; i ++ ) { for ( int j = 0 ; j < maxn ; j ++ ) { l = a [ j ] * i + c ; a [ j ] = l % 10 ; c = l / 10 ; } } int i ; for ( i = maxn - 1 ; i >= 0 ; i -

高精度算法

∥☆過路亽.° 提交于 2020-02-11 22:39:17
复习一下高精度: 高精度加法: #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; vector<int> add(vector<int> a,vector<int> b){ vector<int> res; int i=0,j=0; int t=0; while(i<a.size()&&j<b.size()){ t+=(a[i]+b[i]); res.push_back(t%10); t/=10; i++; j++; } while(i<a.size()){ t+=a[i]; res.push_back(t%10); t/=10; i++; } while(j<b.size()){ t+=b[i]; res.push_back(t%10); t/=10; j++; } while(t){ res.push_back(t%10); t/=10; } reverse(res.begin(),res.end()); return res; } int main(){ string a; string b; cin>>a>>b; vector<int> A,B; for(int i=a.size()-1;i>=0;i--){ A.push

高精度(大数)加法,减法,乘法,除法一次到位

穿精又带淫゛_ 提交于 2020-02-05 01:48:39
计算机并不能计算大数,这时候可以用数组来解决 加法 进位的核心算法 c1[i]=a1[i]+b1[i]+x; x=c1[i]/10; c1[i]%=10; # include <bits/stdc++.h> using namespace std ; # define maxn 100000 int a1 [ maxn ] , b1 [ maxn ] , c1 [ maxn ] ; char a [ maxn ] , b [ maxn ] ; int lena , lenb , lenc , x ; int main ( ) { scanf ( "%s%s" , a , b ) ; //将a,b俩个字符串读进来 memset ( a1 , 0 , sizeof ( a1 ) ) ; //多组输入时的初始化 memset ( b1 , 0 , sizeof ( b1 ) ) ; memset ( c1 , 0 , sizeof ( c1 ) ) ; lena = strlen ( a ) ; lenb = strlen ( b ) ; for ( int i = 0 ; i < lena ; i ++ ) a1 [ lena - i ] = a [ i ] - '0' ; //把字符倒置都存到一个数组内,保证从数的最右边对齐 for ( int i = 0 ; i < lenb ;

高精度算法——B进制星球

Deadly 提交于 2020-01-31 22:34:33
高精度算法——B进制星球 1、题目描述 题目背景 进制题目,而且还是个计算器~~ 题目描述 话说有一天,小Z乘坐宇宙飞船,飞到一个美丽的星球。因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用B(2<=B<=36)进制计数。星球上的人们用美味的食物招待了小Z,作为回报,小Z希望送一个能够完成B进制加法的计算器给他们。 现在小Z希望你可以帮助他,编写实现B进制加法的程序。 输入格式 共3行第1行:一个十进制的整数,表示进制B。第2-3行:每行一个B进制数正整数。数字的每一位属于{0,1,2,3,4,5,6,7,8,9,A,B……},每个数字长度<=2000位。 输出格式 一个B进制数,表示输入的两个数的和。 输入输出样例 输入 #1 复制 4 123 321 输出 #1 复制 1110 2、问题分析 这道题本质上来说就是一道高精度加法的问题吧,但与普通十进制高精度加法不同的是,K进制(2<=K<=36)高精度加法对于处理它的进位来说有着额外的要求。至于怎么处理,我推荐从下图这张表里慢慢摸索… 3、算法源码 # include <bits/stdc++.h> using namespace std ; int n ; //K进制进位对应数组 char number [ 38 ] = { '0' , '0' , '1' , '2' , '3' , '4' , '5' ,

高精度算法(C/C++)

送分小仙女□ 提交于 2020-01-28 15:36:13
高精度算法 (C/C++) 做ACM题的时候,经常遇到大数的加减乘除,乘幂,阶乘的计算,这时给定的数据类型往往不够表示最后结果,这时就需要用到高精度算法。高精度算法的本质是把大数拆成若干固定长度的块,然后对每一块进行相应的运算。这里以考虑4位数字为一块为例,且输入的大数均为正整数(也可以考虑其他位,但要注意在每一块进行相应运算时不能超出数据类型的数值范围;有负整数的话读入时判断一下正负号在决定运算)。 1. 高精度加法 以3479957928375817 + 897259321544245为例: 3479 9579 2837 5817 +897 +2593 +2154 +4245 = = = = 4376 12172 4991 10062 进位0 进位1 进位0 进位1 4377 2172 4992 0062 C语言实现代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 200 //整数乘幂运算函数 int Pow(int a, int b) { int i = 0, result = 1; for(i = 0; i < b; ++i) { result *= a; } return result; } //High Precision Of Addition int main() {

蓝桥杯 基础练习 高精度加法

人走茶凉 提交于 2020-01-20 18:54:14
问题描述   输入两个整数 a 和 b ,输出这两个整数的和。 a 和 b 都不超过100位。 算法描述   由于 a 和 b 都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。   定义一个数组 A , A [0]用于存储 a 的个位, A [1]用于存储 a 的十位,依此类推。同样可以用一个数组 B 来存储 b 。   计算 c = a + b 的时候,首先将 A [0]与 B [0]相加,如果有进位产生,则把进位(即和的十位数)存入 r ,把和的个位数存入 C [0],即 C [0]等于( A [0]+ B [0])%10。然后计算 A [1]与 B [1]相加,这时还应将低位进上来的值 r 也加起来,即 C [1]应该是 A [1]、 B [1]和 r 三个数的和.如果又有进位产生,则仍可将新的进位存入到 r 中,和的个位存到 C [1]中。依此类推,即可求出 C 的所有位。   最后将 C 输出即可。 输入格式   输入包括两行,第一行为一个非负整数 a ,第二行为一个非负整数 b 。两个整数都不超过100位,两数的最高位都不是0。 输出格式   输出一行,表示 a + b 的值。 样例输入 20100122201001221234567890 2010012220100122 样例输出

算法提高 高精度加法

家住魔仙堡 提交于 2020-01-16 01:17:17
算法提高 高精度加法 输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。 定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。 计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。 最后将C输出即可。 输入格式: 输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。 输出格式: 输出一行,表示a + b的值。 输入样例: 在这里给出一组输入。例如: 20100122201001221234567890 2010012220100122 输出样例: 在这里给出相应的输出。例如: 20100122203011233454668012 方法: 首先用字符串存储这两个数,判断两个数的长度,循序次数取短的数的长度

高精度阶乘计算_蓝桥杯

一个人想着一个人 提交于 2020-01-14 11:50:13
/** 问题描述   输入一个正整数n,输出n!的值。   其中n!=1*2*3*…*n。 算法描述   n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。   将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。   首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。 输入格式   输入包含一个正整数n,n<=1000。 输出格式   输出n!的准确值。 样例输入 10 样例输出 3628800 */ package jiChuLianXi; import java.util.Scanner; public class Factorial { public static String multiply(String num1, String num2) { if(num1.length()==0||num2.length()==0) return ""; int[] ret=new int[num1.length()+num2.length()];//int数组,存放计算结果,最长为两个数的长度和 for(int i=num1.length()-1;i>=0;i--){//从num1的最低位开始算 for(int j=num2.length

高精度算法总结

两盒软妹~` 提交于 2019-12-23 01:17:13
高精度算法总结(C++) A + a , A − a , A ∗ a , A / a A+a,A-a,A*a,A/a A + a , A − a , A ∗ a , A / a 四种 大整数运算 核心:将A的每一位放在数组里,且第0位存放个位数字,即逆序存放 高精度加法 核心: A i + B i + t Ai + Bi + t A i + B i + t 参考题目: LeetCode989 # include <iostream> # include <cstring> # include <vector> using namespace std ; const int N = 10e6 + 10 ; // 模板 vector < int > add ( vector < int > & A , vector < int > & B ) { vector < int > C ; int t = 0 ; // 进位 for ( int i = 0 ; i < A . size ( ) || i < B . size ( ) ; i ++ ) { if ( i < A . size ( ) ) t + = A [ i ] ; // 当前为有A[i] 就加上 B[i]同理,得到当前为相加为A[i] + B[i] + t if ( i < B . size ( ) ) t + = B [