高精度小数加法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度小数加法相关的知识,希望对你有一定的参考价值。
例题链接:hdu1753 http://acm.hdu.edu.cn/showproblem.php?pid=1753
代码:
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; const int maxn = 500; char a[maxn]; char b[maxn]; int aa1[maxn]; int aa2[maxn]; int bb1[maxn]; int bb2[maxn]; int ansx[maxn]; int ansz[maxn]; int main() { while(~scanf("%s%s",&a,&b)) { memset(aa1 , 0 , sizeof(aa1)); memset(aa2 , 0 , sizeof(aa2)); memset(bb1 , 0 , sizeof(bb1)); memset(bb2 , 0 , sizeof(bb2)); memset(ansx , 0 ,sizeof(ansx));//小数的答案数组 memset(ansz , 0 ,sizeof(ansz));//整数的答案数组 int lena, lenb; int i,j; ///处理串a int ta = lena = strlen(a); for(i = 0; i < lena ; i++) { if(a[i] == ‘.‘) { ta = i; break; } } ///整数逆存存放, 比如 1 2 3 存为 3 2 1 for(i = ta - 1; i >= 0; i--) { aa1[ta - i - 1] = a[i] - ‘0‘; } ///小数正序存放 ,比如 4 5 6 存为 4 5 6 j = 0; for(i = ta + 1; i < lena ; i++) { aa2[j++] = a[i] - ‘0‘; } ///处理串b int tb = lenb = strlen(b); for(i = 0; i < lenb ; i++) { if(b[i] == ‘.‘) { tb = i; break; } } ///整数逆存存放, 比如 1 2 3 存为 3 2 1 for(i = tb - 1; i >= 0; i--) { bb1[tb - i - 1] = b[i] - ‘0‘; } ///小数正序存放 ,比如 4 5 6 存为 4 5 6 j = 0; for(i = tb + 1; i < lenb ; i++) { bb2[j++] = b[i] - ‘0‘; } ///ADD ///小数 int lenaa2 = lena - ta; int lenbb2 = lenb - tb; int lenx = lenaa2 > lenbb2 ? lenaa2 : lenbb2; int jinwei = 0; for(i = lenx - 1; i >= 0 ; i--) { ansx[i] = (aa2[i] + bb2[i] + jinwei)%10; jinwei = (aa2[i] + bb2[i] + jinwei)/10; } int lenz = ta > tb ? ta : tb; for(i = 0; i <= lenz ; i++) { ansz[i] = (aa1[i] + bb1[i] + jinwei)%10; jinwei = (aa1[i] + bb1[i] + jinwei)/10; } if(ansz[lenz] > 0) lenz++; for(i = lenz - 1; i >= 0; i--) { printf("%d",ansz[i]); } while(ansx[lenx - 1] == 0) { if(ansx[lenx - 1] == 0) { lenx--; } } if(lenx > 0) printf("."); for(i = 0; i < lenx ; i++) { printf("%d",ansx[i]); } printf("\n"); } return 0; }
以上是关于高精度小数加法的主要内容,如果未能解决你的问题,请参考以下文章