本文主要是介绍hdu 1753 大明A+B(实数高精度),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目连接:1753 大明A+B
解题思路:将实数的整数部分和小数数部分分开储存, 小数部分正序储存,由两个数中小数位数最大的地方开始相加(普通的高精度加法), 注意赋值的时候要清零,这里默认没有位数的地方为零。 如果加到i =0位后任有剩, 要保留到整数为进行加法。
#include <stdio.h>
#include <string.h>
const int N = 405;struct bign { int s[N], ns;int f[N], nf;bign () {ns = nf = 0;memset(s, 0, sizeof(s));memset(f, 0, sizeof(f));}bign operator = (const char* num) {ns = nf = 0;memset(s, 0, sizeof(s));memset(f, 0, sizeof(f));int len = strlen(num), flag = 0;for (int i = 0; i < len; i++)if (num[i] == '.') {flag = i;break;}if (flag) {for (int i = flag + 1; i < len; i++)f[nf++] = num[i] - '0';flag--;}elseflag = len - 1;while (flag >= 0)s[ns++] = num[flag--] - '0';return *this;}bign operator + (const bign& c) {int t = 0;bign sum;if (nf > c.nf) sum.nf = nf;else sum.nf = c.nf;for (int i = sum.nf - 1; i >= 0; i--) {sum.f[i] = f[i] + c.f[i] + t;t = sum.f[i] / 10;sum.f[i] %= 10; }for (sum.ns = 0; sum.ns < ns || sum.ns < c.ns; sum.ns++) {sum.s[sum.ns] = s[sum.ns] + c.s[sum.ns] + t;t = sum.s[sum.ns] / 10;sum.s[sum.ns] %= 10; }while (t) {sum.s[sum.ns++] = t % 10;t /= 10;}return sum;}void del() {while (ns && !s[ns - 1])ns--;while (!f[nf - 1])nf--;}void print() {del();if (ns) {for (int i = ns - 1; i >= 0; i--)printf("%d", s[i]);}elseprintf("0\n");if (nf)printf(".");for (int i = 0; i < nf; i++)printf("%d", f[i]);}
};int main() {bign a, b, sum;char num1[N], num2[N];while (scanf("%s%s", num1, num2) == 2) {a = num1;b = num2;sum = a + b;sum.print();printf("\n");}return 0;
}
这篇关于hdu 1753 大明A+B(实数高精度)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!