练习1P1601 高精度加法题目背景本题是高精度加法的模板题。题目描述给定两个非负整数a,ba,ba,b求它们的和。不用考虑负数。输入格式输入共两行每行一个非负整数分别为a,ba,ba,b。输出格式输出一行一个非负整数表示ababab的值。输入输出样例 #1输入 #11 1输出 #12输入输出样例 #2输入 #21001 9099输出 #210100说明/提示对于20%20\%20%的测试数据a,b≤109a,b \le 10^9a,b≤109对于40%40\%40%的测试数据a,b≤1018a,b \le 10^{18}a,b≤1018对于100%100\%100%的测试数据0≤a,b≤105000\le a,b \le 10^{500}0≤a,b≤10500。解题思路①先以字符串形式读取大数再利用ASCⅡ码进行转换 拆分大数存储到整数数组中逆着拆 方便进位②将每一位都加起来10 就进位 本位%10③如果发生进位 数组的长度记得1参考代码#includeiostream#includestring#includealgorithmusingnamespacestd;intmain(){string a,b;intA[520]{0},B[520]{0},C[520]{0};cinab;intlenaa.length();intlenbb.length();for(intilena-1,j0;i0;i--,j){A[j]a[i]-0;}for(intilenb-1,j0;i0;i--,j){B[j]b[i]-0;}intlenmax(lena,lenb);for(inti0;ilen;i){C[i]A[i]B[i];//要用 不能直接赋值会导致进位来的数据被覆盖C[i1]C[i]/10;C[i]%10;}if(C[len])//我的基底是从0开始的 如果没有进位最高位就在len-1 现在可能有进位 那最高位就在lenlen;for(intilen-1;i0;i--)coutC[i];return0;}练习2P1303 A*B Problem题目背景高精度乘法模板题。题目描述给出两个非负整数求它们的乘积。输入格式输入共两行每行一个非负整数。输出格式输出一个非负整数表示乘积。输入输出样例 #1输入 #11 2输出 #12说明/提示每个非负整数不超过10200010^{2000}102000。解题思路基本和高精加同理参考代码#includeiostream#includestring#includealgorithmusingnamespacestd;intmain(){inta[5010]{0},b[5010]{0},c[5010]{0};string A,B;cinAB;intlenaA.length();intlenbB.length();for(intilena-1,j1;i0;i--,j){a[j]A[i]-0;}for(intilenb-1,j1;i0;i--,j){b[j]B[i]-0;}for(inti1;ilena;i){for(intj1;jlenb;j){c[ij-1]a[i]*b[j];}}//处理进位intlenlenalenb;for(inti1;ilen;i){c[i1]c[i]/10;c[i]%10;}//处理前导零最高位可能是0例如两位数乘两位数得到的可能是三位数最多不会超过两个因子的位数之和 但是上面的len给了4 所以第4位是0 要把它处理掉while(!c[len])len--;for(intimax(1,len);i1;i--)//如果乘积为0 len会一直减到0 没输出了{coutc[i];}return0;}练习3P1009 [NOIP 1998 普及组] 阶乘之和题目描述用高精度计算出S1!2!3!⋯n!S 1! 2! 3! \cdots n!S1!2!3!⋯n!n≤50n \le 50n≤50。其中!表示阶乘定义为n!n×(n−1)×(n−2)×⋯×1n!n\times (n-1)\times (n-2)\times \cdots \times 1n!n×(n−1)×(n−2)×⋯×1。例如5!5×4×3×2×11205! 5 \times 4 \times 3 \times 2 \times 11205!5×4×3×2×1120。输入格式一个正整数nnn。输出格式一个正整数SSS表示计算结果。输入输出样例 #1输入 #13输出 #19说明/提示【数据范围】对于100%100 \%100%的数据1≤n≤501 \le n \le 501≤n≤50。【其他说明】注《深入浅出基础篇》中使用本题作为例题但是其数据范围只有n≤20n \le 20n≤20使用书中的代码无法通过本题。如果希望通过本题请继续学习第八章高精度的知识。NOIP1998 普及组 第二题参考代码#includeiostream#includealgorithmusingnamespacestd;voidmul(intf[],intf_len,intx)// x是n f和f_len是(n-1)的{inttmp[66]{0};//计算n!for(inti1;if_len;i){tmp[i]f[i]*x;}intlenf_len;//处理进位for(inti1;ilen;i){tmp[i1]tmp[i]/10;tmp[i]%10;}//处理长度变化 同时还要处理最高位可能还没有进位的情况 乘法有可能10while(tmp[len1]!0){len;tmp[len1]tmp[len]/10;tmp[len]%10;}//更新阶乘的结果for(inti1;ilen;i){f[i]tmp[i];}f_lenlen;//因为传的是f_len的地址所以直接赋值会对原值进行修改}voidadd(intsum[],intsum_len,intf[],intf_len){intlenmax(f_len,sum_len);inttmp[66]{0};//更新和的大小 前n-1个阶乘的和 再加上 n!for(inti1;ilen;i){tmp[i]sum[i]f[i];}//处理和的进位for(inti1;ilen;i){tmp[i1]tmp[i]/10;tmp[i]%10;}//处理和的长度变化 注意高精加的最高位while(tmp[len1]!0){len;}for(inti1;ilen;i){sum[i]tmp[i];}sum_lenlen;}intmain(){intn0;cinn;intf[66]{0};//当前(n-1)!的大小intf_len1;//当前(n-1)的长度intsum[66]{0};//当前所有阶乘的和 (1! 2! ... (n-1)!)intsum_len1;//当前所有阶乘的和的长度f[1]1;//初始化第一个的值sum[1]0;//和初始化为0//总体思路是先阶乘再加for(inti1;in;i){mul(f,f_len,i);add(sum,sum_len,f,f_len);}for(intisum_len;i1;i--){coutsum[i];}return0;}