当前位置: 首页 > news >正文

C/C++和JAVA 实现大数相加

HDU 1753 大明A+B

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1753

题目大意:  两个不超过400位的带小数的整数,求出透明的和,要求最简形式,即小数后面的后缀0不能输出。


首先是自己写的C++版AC代码,有些长,挺考验细节的

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int maxq(int a, int b){
	return a > b ? a : b;
}
int main(){
	char a[410], b[410], xc[410], zc[410];
	int alen, blen, max, flag, k, kk, ad, bd, za, zb, xsa, xsb, zz, min, dd, gg;
	while(~scanf("%s %s", a+1, b+1)){
		flag = 0; gg = 1;
		alen = strlen(a+1);
		blen = strlen(b+1);
		if(alen == 3 && blen == 3 && a[1] == '0' && b[1] == '0' && a[2] == '.' && b[2] == '.' && a[3] == '0' && b[3] == '0')
		ad = alen + 1; bd = blen + 1;
		for(int i = 1; i <= alen; ++i)
			if(a[i] == '.'){ad = i; gg = 0; break;}
		if(gg) ad = alen+1;
		gg = 0;
		for(int i = 1; i <= blen; ++i)
			if(b[i] == '.'){bd = i; gg = 0; break;}
		if(gg) bd = blen+1;
		if(ad > alen){ za = alen; xsa = 0; }
		else {za = ad-1; xsa = alen - ad; }
		if(bd > blen){ zb = blen; xsb = 0; }
		else {zb = bd-1; xsb = blen - bd; }
		if(xsa > xsb) { max = alen; min = blen; flag = 1; zz = ad; dd = xsa; xc[xsa+1] = '\0'; k = xsa - xsb;}
		else {max = blen; min = alen; zz = bd; dd = xsb; xc[xsb+1] = '\0'; k = xsb - xsa;}
		while(k--){
			if(flag) xc[dd--] = a[max--];
				else xc[dd--] = b[max--];
		}
		k = 0;
		for( ; max > zz; --max, --min, --dd){
			if(flag){
				if(k){ 
					kk = (a[max]-'0') + (b[min]-'0') + 1;
					if(kk > 9){ k = 1; xc[dd] = '0' + (kk - 10);}
					else {k = 0; xc[dd] = '0' + kk;}
				}
				else {
					kk = (a[max]-'0') + (b[min]-'0');
					if(kk > 9){ k = 1; xc[dd] = '0' + (kk - 10);}
					else {k = 0; xc[dd] = '0' + kk;}
				}
			}
			else {
				if(k){ 
					kk = (b[max]-'0') + (a[min]-'0') + 1;
					if(kk > 9){ k = 1; xc[dd] = '0' + (kk - 10);}
					else {k = 0; xc[dd] = '0' + kk;}
				}
				else {
					kk = (b[max]-'0') + (a[min]-'0');
					if(kk > 9){ k = 1; xc[dd] = '0' + (kk - 10);}
					else {k = 0; xc[dd] = '0' + kk;}
				}
			}
		}
		flag = 0;
		max--; min--;
		if(za > zb){max = za; flag = 1;}
		else {max = zb;}
		min = max ^ za ^ zb;
		zc[max+1] = '\0';
		for(int i = max, j = min; i >= 1; --i, --j){
			min--;
			if(min >= 0)
				if(flag)
					if(k){ 
						kk = (a[i]-'0') + (b[j]-'0') + 1;
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
					else {
						kk = (b[j]-'0') + (a[i]-'0');
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
				else
					if(k){ 
						kk = (b[i]-'0') + (a[j]-'0') + 1;
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
					else {
						kk = (b[i]-'0') + (a[j]-'0');
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
			else
				if(flag){
					if(k){ 
						kk = (a[i]-'0') + 1;
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
					else  zc[i] = a[i];
				}
				else{
					if(k){ 
						kk = (b[i]-'0') + 1;
						if(kk > 9){ k = 1; zc[i] = '0' + (kk - 10);}
						else {k = 0; zc[i] = '0' + kk;}
					}
					else  zc[i] = b[i];
				}
		}
		if(xsa > xsb) max = xsa; else max = xsb;
		for(int i = max; i >= 1; --i)
			if(xc[i] == '0'){xc[i] = '\0';}
			else break;
		if(xc[1] == '\0' || maxq(xsa, xsb) == 0){
			if(k) printf("1");
			printf("%s\n", zc+1);
		}
		else{
			if(k) printf("1");
			printf("%s.%s\n", zc+1, xc+1);
		}
	}
	return 0;
}


接下来是JAVA实现的代码,很

import java.math.BigDecimal;  
import java.util.*;  
public class Main {  
    public static void main(String[] args) {  
        Scanner cin = new Scanner(System.in);  
        BigDecimal a , b;  
        while(cin.hasNext()){  
            a = cin.nextBigDecimal();  
            b = cin.nextBigDecimal();  
            System.out.println(a.add(b).stripTrailingZeros().toPlainString());  
        }  
    }  
}  

以上两种代码都可以实现这题的功能以及AC~






相关文章:

  • 苹果推出开源医学研究框架ResearchKit
  • 康拓展开及其逆运算和全排列函数
  • 用R分析时间序列(time series)数据
  • QDUoj GZS的三角形 棋盘里的数学 (数学规律题)
  • N-tier architecture N层架构 (转)
  • 树状数组区间更新+区间查询+单点查询
  • PHPCMS如何实现后台访问限制?
  • 树的直径 —— 即一棵树的最长路 附题(大臣的旅费 by蓝桥杯)
  • 一个关于按位或的故事~~(QDU-码农必修)
  • ConcurrentHashMap 解读(一)
  • Today一只菜鸡的PAT甲级测试(PAT1124, PAT1125, PAT1126, PAT1127)
  • 快速排序--自行实现+qsort+sort
  • 归并排序--二路归并
  • quartz定时任务时间设置描
  • ctype.h头文件中的tolower和toupper以及cctype其他函数的应用
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Java 网络编程(2):UDP 的使用
  • Java深入 - 深入理解Java集合
  • Markdown 语法简单说明
  • PAT A1092
  • Python十分钟制作属于你自己的个性logo
  • 从伪并行的 Python 多线程说起
  • 服务器之间,相同帐号,实现免密钥登录
  • 基于webpack 的 vue 多页架构
  • 力扣(LeetCode)21
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 微信开放平台全网发布【失败】的几点排查方法
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • "无招胜有招"nbsp;史上最全的互…
  • # Java NIO(一)FileChannel
  • #AngularJS#$sce.trustAsResourceUrl
  • #Linux(make工具和makefile文件以及makefile语法)
  • #宝哥教你#查看jquery绑定的事件函数
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • ()、[]、{}、(())、[[]]命令替换
  • (9)STL算法之逆转旋转
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Matlab)使用竞争神经网络实现数据聚类
  • (pytorch进阶之路)扩散概率模型
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (转)可以带来幸福的一本书
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET导入Excel数据
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET开源项目介绍及资源推荐:数据持久层
  • @Controller和@RestController的区别?
  • @reference注解_Dubbo配置参考手册之dubbo:reference