C++高精度算法的使用场景详解
描述如果要计算的数超过了long long怎么解决? —使用高精度加减乘除简单理解就是 很大的数进行加减乘除。1. 高精度加法1. 思路创建对应的数组变量及其他变量输入字符串将读入的数据转化为整数类型并逆序反转存储到数组中将两个数组做累加(注意进位)判断最高位是否为0大于0代表进位了则让长度加1倒序输出2. 代码123456789101112131415161718192021222324252627#includebits/stdc.husingnamespacestd;inta[510], b[510], c[510];//a:被加数 b:加数 c:和intmain(){// 1. 输入字符串string str1,str2;cin str1 str2;// 2. 1,2,3,4转换为{1,2,3,4},并且反转 {4,3,2,1}for(inti 0; i str1.size(); i )a[str1.size()-1 - i] str1[i] -0;for(inti 0; i str2.size(); i )b[str2.size()-1 - i] str2[i] -0;// 3. 找两个字符串最大的个数目的是为了将每一位计算完intans max(str1.size(), str2.size());// 4. 相加(ab)for(inti 0; i ans; i ){//遍历至最大长度避免有的数字没计算c[i] a[i] b[i];//相加c[i1] c[i] / 10;// 进位c[i] % 10;//将加的结果求余10 得出第i位}//4. 如果结果数组第ans位的数大于0(大于0代表进位了)则让长度增加1while(c[ans]0) ans;//5. 倒序输出for(inti ans-1; i 0; i--)cout c[i];return0;}123456789101112131415161718192021222324252627282930#includebits/stdc.husingnamespacestd;inta[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:加数1 b:加数2 c:进位数组 ans:结果数组intmain(){// 1. 输入字符串string str1,str2;cin str1 str2;len_a str1.length();len_b str2.length();// 2. 1,2,3,4转换为{1,2,3,4},并且反转 {4,3,2,1}for(inti 0; i str1.size(); i )a[str1.size()-1 - i] str1[i] -0;for(inti 0; i str2.size(); i )b[str2.size()-1 - i] str2[i] -0;// 3. 找两个字符串最大的个数目的是为了将每一位计算完len_ans max(len_a,len_b);// 4. 相加(ab)for(inti0;ilen_ans;i){ans[i] a[i] b[i] c[i];//结果数组 等于 被加数 加上 加数 加上 进位的数if(ans[i] 9){//如果结果数组大于9则进位c[i1] ans[i] / 10;//给进位数组赋值ans[i] % 10;// 让结果数组大于9的数求余10变成个位数}}//5. 如果结果数组len_ans位的数大于0则让长度增加1while(ans[len_ans]0) len_ans;//6. 倒叙输出for(intilen_ans-1;i0;i--) coutans[i];return0;}2. 高精度减法1. 思路定义被减数a减数b结果c数组输入被减数和减数并且将数据倒叙存入数组中。找两个字符串最大的个数目的是为了将每一位计算完将两个数组做相减遍历至最大长度避免有的数字没计算 。去掉前导 0 。例如结果为089不需要0循环遍历输出2. 代码1234567891011121314151617181920212223242526272829#includebits/stdc.husingnamespacestd;inta[510], b[510], c[510];//a:被减数 b:减数 c:结果intmain(){// 1. 输入字符串string str1,str2;cin str1 str2;// 2. 1,2,3,4转换为{1,2,3,4},并且反转 {4,3,2,1}for(inti 0; i str1.size(); i )a[str1.size()-1 - i] str1[i] -0;for(inti 0; i str2.size(); i )b[str2.size()-1 - i] str2[i] -0;// 3. 找两个字符串最大的个数目的是为了将每一位计算完intans max(str1.size(), str2.size());// 4. 相减(a-b)for(inti 0; i ans; i ){//遍历至最大长度避免有的数字没计算if(a[i] b[i]){a[i1] - 1;//向前借一位a[i] 10;// 借一位以后加10}c[i] a[i] - b[i];}//5. 如去掉前导 0 。例如结果为089不需要0while(c[ans-1]0 ans1) ans--;//6. 倒序输出for(inti ans-1; i 0; i--)cout c[i];return0;}123456789101112131415161718192021222324252627282930#includebits/stdc.husingnamespacestd;inta[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:被减数 b:减数 c:进位 ans:结果intmain(){// 1. 输入字符串string str1,str2;cin str1 str2;len_a str1.length();len_b str2.length();// 2. 1,2,3,4转换为{1,2,3,4},并且反转 {4,3,2,1}for(inti 0; i str1.size(); i )a[str1.size()-1 - i] str1[i] -0;for(inti 0; i str2.size(); i )b[str2.size()-1 - i] str2[i] -0;// 3. 找两个字符串最大的个数目的是为了将每一位计算完len_ans max(len_a,len_b);// 4. 相减(a-b)for(inti0;ilen_ans;i){ans[i] a[i] - b[i] - c[i];//结果数组 等于 被减数 减去 减数 减去 进位的数if(ans[i] 0){//如果结果数组小于0则借位ans[i] 10;// 借1位加上10c[i1];// 进位数组加1}}//5. 如去掉前导 0 。例如结果为089不需要0while(len_ans1 ans[len_ans-1]0) len_ans--;//6. 倒序输出for(intilen_ans-1;i0;i--) coutans[i];return0;}3. 如果出现被减数的位数小于减数时呢1234567891011121314151617181920212223242526272829303132333435363738#includebits/stdc.husingnamespacestd;inta[510], b[510], c[510];//a:被减数 b:减数 c:结果intflag 0;intmain(){// 1. 输入字符串string str1,str2;cin str1 str2;//2. str1.size() str2.size() 或者 两个数一样长并且被减数的数值小于减数时才需要交换两数位置if(str1.size() str2.size() || str1.size() str2.size() str1 str2) {string t str1;str1 str2;str2 t;flag 1;}// 3. 1,2,3,4转换为{1,2,3,4},并且反转 {4,3,2,1}for(inti 0; i str1.size(); i )a[str1.size()-1 - i] str1[i] -0;for(inti 0; i str2.size(); i )b[str2.size()-1 - i] str2[i] -0;// 4. 找两个字符串最大的个数目的是为了将每一位计算完intans max(str1.size(), str2.size());// 5. 相减(a-b)for(inti 0; i ans; i ){//遍历至最大长度避免有的数字没计算if(a[i] b[i]){a[i1] - 1;//向前借一位a[i] 10;// 借一位以后加10}c[i] a[i] - b[i];}//6.如去掉前导 0 。例如结果为089不需要0while(c[ans-1]0 ans1) ans--;//7. 倒叙输出if(flag 1) cout-;for(inti ans-1; i 0; i--)cout c[i];return0;}到此这篇关于C高精度算法的使用场景详解的文章就介绍到这了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2566504.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!