OJ_浮点数加法(高精度运算)

题干

在这里插入图片描述

C++实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<map>
#include<string>
using namespace std;

string GetInteger(string a) {
   
	return a.substr(0, a.find('.'));
}

string GetFraction(string a) {
   
	return a.substr(a.find('.') +1 ,a.size() - a.find('.'));
}

//利用引用参数,返回多个信息
void FractionPlus(string& res, int& carry, string fa, string fb) {
   
	int size = max(fa.size(), fb.size());
	//将两个数的小数部分对齐
	while (fa.size() < size) {
   
		fa.push_back('0');
	}
	while (fb.size() < size) {
   
		fb.push_back('0');
	}

	res.resize(size);//给res申请内存
	carry = 0;

	//从右往左加
	for (int i = size - 1; i >= 0; i--)
	{
   
		// '0' = '0'
		// '3' = '0' + 3

		if (fa[i] + fb[i] + carry - '0' > '9') {
   
			res[i] = fa[i] + fb[i] + carry - '0' - 10;
			carry = 1;
		}
		else {
   
			res[i] = fa[i] + fb[i] + carry - '0';
			carry = 0;
		}
	}

	return;
}

void IntegerPlus(string& res, int carry, string ia, string ib) {
   
	res.clear();//清空字符串
	for (int i = ia.size() - 1, j = ib.size() - 1; i >= 0 || j >= 0 || carry == 1; --i, --j) {
   
		if (i >= 0 && j >= 0) {
   
			if (ia[i] + ib[j] + carry - '0' > '9') {
   
				res.insert(res.begin(), ia[i] + ib[j] + carry - '0' - 10);
				carry = 1;
			}
			else {
   
				res.insert(res.begin(), ia[i] + ib[j] + carry - '0');
				carry = 0;
			}
		}
		else if (i >= 0 && j < 0) {
   
			if (ia[i] + carry > '9') {
   
				res.insert(res.begin(), ia[i] + carry - 10);
				carry = 1;
			}
			else {
   
				res.insert(res.begin(), ia[i] + carry);
				carry = 0;
			}
		}
		else if(i < 0 && j >= 0){
   
			if (ib[j] + carry > '9') {
   
				res.insert(res.begin(), ib[j] + carry - 10);
				carry = 1;
			}
			else {
   
				res.insert(res.begin(), ib[j] + carry);
				carry = 0;
			}
		}
		else {
   
			res.insert(res.begin(), '1');
			carry = 0;
		}
	}

 	return;
}

int main() {
   
	/*string a = "12345.6789";
	string b = "333.33333";*/

	char arra[1024];
	char arrb[1024];

	while (scanf("%s%s", arra, arrb) != EOF) {
   
		string a = arra;
		string b = arrb;

		string ia = GetInteger(a);
		string ib = GetInteger(b);
		string fa = GetFraction(a);
		string fb = GetFraction(b);

		string res;
		int carry;
		FractionPlus(res, carry, fa, fb);
		string ires;
		IntegerPlus(ires, carry, ia, ib);

		printf("%s.%s\n", ires.c_str(), res.c_str());
	}

	return 0;
}

相关推荐

  1. 点数加法

    2024-02-10 12:22:01       19 阅读
  2. 点数精度问题

    2024-02-10 12:22:01       37 阅读
  3. KY79 点数加法

    2024-02-10 12:22:01       20 阅读
  4. 纯C++设置点数精度

    2024-02-10 12:22:01       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-10 12:22:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-10 12:22:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-10 12:22:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-10 12:22:01       18 阅读

热门阅读

  1. SQL语言复习-----1

    2024-02-10 12:22:01       25 阅读
  2. C语言数组名涵义

    2024-02-10 12:22:01       28 阅读
  3. 练习:鼠标类设计之1_类内容解析

    2024-02-10 12:22:01       30 阅读
  4. MySQL 的Sql脚本是如何被编译的

    2024-02-10 12:22:01       26 阅读
  5. MySQL基础查询篇(9)-数学函数在查询中的应用

    2024-02-10 12:22:01       29 阅读
  6. dreamtalk 学习笔记

    2024-02-10 12:22:01       23 阅读
  7. 计算机网络(第六版)复习提纲30

    2024-02-10 12:22:01       23 阅读