实数加法的一个解决思路

33:实数加法
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 65536kB
描述
求2个实数相加的和。

输入输出中出现的实数都有如下的形式: P1P2...Pi.Q1Q2...Qj。对于整数部分,P1P2...Pi是一个非负整数;对于小数部分,至少有一位且最后一位Qj不等于0。

输入
2行,分别是两个加数。每个加数不超过100个字符。
输出
一行输出是相应的和。数据保证一定是一个小数部分不为0的实数。
样例输入
0.111111111111111111111111111111
0.111111111111111111111111111111
样例输出
0.222222222222222222222222222222

这个问题交了好几次,漏打了一个按址传递,漏了一种情况。简要分析一下,这个题的要点就是:

1、小数点对齐

2、结尾0的处理

结尾0的处理这里开始漏了一种情况,只考虑了小数点之后的不要了,小数点之前的占位0没考虑。例如:1.2+8.8这样。小数点对齐倒是没什么问题,但是处理整数部分对齐的时候忘了一个&,调试半天。这个题最开始的思路是想从小数点开始,分别向左右取4位,保存到int[],然后对齐处理,发现挺烦人的,于是直接在字符串上处理:

1、获取小数点左右两部分,把右边较短的用0右补齐,把左边较短的用0左补齐。

2、从最低位开始逐个字符计算结果和进位,舍弃结尾0。(这里疏漏了,小数点之前的0不能舍弃)。

3、最高位计算之后如果有进位,在左侧添加一位。

4、插入小数点。

5、输出。

这种在字符串上直接处理的做法效率较低,如果时间比较少计算量比较大,那么一定要用int[]数组,一般可以采用万进制。但是这个题完全可以这样做,就像那个除以13的问题一样,都可以直接处理。

#include<iostream>
#include<cstring>
using namespace std;
inline void zx(string v,string &z,string &x){    //分离整数和小数部分
    int i;
    i=v.find(".");
    z=v.substr(0,i);
    x=v.substr(i+1,v.size()-1);
}
inline void xadd(string &x1,string &x2){        //将小数部分较短的填充0以对齐
    if(x1.size()>x2.size()){
        x2+=string(x1.size()-x2.size(),‘0‘);
    }else{
        x1+=string(x2.size()-x1.size(),‘0‘);
    }
}
inline void zadd(string &z1,string &z2){        //将整数部分较短的填充0以对齐
    if(z1.size()>z2.size()){
        z2=string(z1.size()-z2.size(),‘0‘)+z2;
    }else{
        z1=string(z2.size()-z1.size(),‘0‘)+z1;
    }
}
int main(){
    string s1,s2,z1,x1,z2,x2,result;
    cin>>s1>>s2;
    zx(s1,z1,x1);    //整体思路就是按小数点对齐,两侧短的用0补充。这样就可以从低位一直计算到高位。
    zx(s2,z2,x2);
    zadd(z1,z2);
    xadd(x1,x2);
    s1=z1+x1;            //此时的s1,s2完全对齐,算法可以得到简化。
    s2=z2+x2;
    int i,cur,up=0,rightzeroflag=1;
    for(i=int(s1.size())-1;i>=0;i--){
        cur=s1[i]-‘0‘+s2[i]-‘0‘+up;        //当前位的总和
        if(i<int(z1.size())){            //小数点后面的不计入,但是过了小数点就需要占位了。
            rightzeroflag=0;
        }
        if(cur%10==0 && rightzeroflag==1){    //末尾多余的0不计入。
        }else{
            rightzeroflag=0;
            result=char(cur%10+‘0‘)+result;    //计入当前位的值
        }
        up=cur/10;
    }
    cur=z1.size();    //整数部分的大小,确定小数点位置。
    if(up!=0){        //如果最高位计算之后需要进位
        result=char(up+‘0‘)+result;
        cur++;
    }
    if(cur<int(result.size())){    //如果整数部分大小比返回值小,说明有小数部分。
        result.insert(cur,".");
    }
    cout<<result<<endl;
}

这个代码好处就在于不用考虑多少位,怎么对齐的问题。还是对C++有一种排斥感,实际上截取字符串也很简单,但就是感觉别扭。

时间: 2024-11-05 18:40:32

实数加法的一个解决思路的相关文章

linux删除不了文件, 修改文件属性也删除不了的一个解决思路

场景: 公司要求卸载软件时, 也包含卸载一个目录下的所有文件. 于是去修改删除文件的shell脚本, 添加了删除文件及文件夹的命令(当然是在root权限下的) 如: rm -rf /home/vito/**** 但发现运行shell脚本时, 死活删除不了那个目录下的文件, 当然也就删除不了目录, 同时提示----rm: cannot remove '/home/vito/****/xxx.xxx': Permission denied. 在网上查了一下, 说这种情况下, 一般都是该文件被设置了一

树莓派3b 串口乱码的一个解决思路

首先确认波特率设置正确,为115200 向microSD卡中烧录树莓派官方的镜像后,先不要急着把它插入树莓派中. 在电脑上打开microSD卡,按如下方式修改config.txt和cmdline.txt这两个文件, 在config.txt文件中附加 dtoverlay=pi3-miniuart-bt 把cmdline.txt中的内容换成 dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 roo

微信小程序模板消息群发解决思路

基于微信的通知渠道,微信为开发者提供了可以高效触达用户的模板消息能力,以便实现服务的闭环并提供更佳的体验.(微信6.5.2及以上版本支持模板功能.低于该版本将无法收到模板消息.) 模板推送位置:服务通知(点击查看详情还能跳转到下发消息的小程序的指定页面) 模板下发条件:用户本人在微信体系内与页面有交互行为后触发 微信小程序模板消息使用说明(官方文档):https://mp.weixin.qq.com/debug/wxadoc/dev/api/notice.html 为了防止对模板消息的滥用,带来

一个Android多平台问题兼容解决思路

问题:使用AS打出来的签名包,在调试一直用的5.0的小米手机上可以正常运行,4.4的联想手机上闪退,5.1的模拟器上闪退. 抛出:java.lang.UnsatisfiedLinkError,ClassLoader找不到相关的so库. 解决思路: 猜想跟CPU架构有关系,查询如下(cat /proc/cpuinfo): 模拟器:                     电脑使用的是Intel的cpu                         x86_64架构 联想:Processor  

TCP Incast 问题TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU)。只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向

TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU).只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向多个存储服务器发起并发TCP请求,且所有服务器同时向客户端发送SRU. 出现的问题: 1)         这种多对一的服务器向客

海量数据解决思路之Hash算法

海量数据解决思路之Hash算法   一.概述 本文将粗略讲述一下Hash算法的概念特性,里边会结合 分布式系统负载均衡 实例对Hash的一致性做深入探讨.另外,探讨一下Hash算法在海量数据处理方案中的通用性.最后,从源代码出发,具体分析一下Hash算法在MapReduce框架的中的应用. 二.Hash算法 Hash可以通过散列函数将任意长度的输入变成固定长度的输出,也可以将不同的输入映射成为相同的相同的输出,而且这些输出范围也是可控制的,所以起到了很好的压缩映射和等价映射功能.这些特 性被应用

SQL注入解决思路(C#示例)

最近在编程中遇到一个SQL注入防护的问题.在这里顺便把SQL注入小结一下.以MYSQL(5.1)为例. 一.常规的SQL语句 观察SQL语句 SELECT * FROM [tableName] WHERE col1='value1' 这个语句由3个部分组成,SELECT子句筛选得到结果,FROM子句指定了筛选的范围,WHERE子句指定了条件.当在其中进行如下置换: SELECT * FROM [tableName] WHERE 1 之后,选出了[tableName]表中的全部内容.分析其语法不难

Can&#39;t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘ (2)解决思路

首先说明一下mysql.sock文件的作用: 连接mysql有两种方式,第一种是TCP/IP,第二种就是直接使用unix domain socket,它比TCP/IP块. mysql.sock是在mysql-server和client在同一服务器上时,发起本地连接时可用,而无需定义-h参数指定具体的IP.mysql.sock是随每次mysql server启动时生成,通常配置参数是将mysql.sock生成在/tmp/目录下.即在/etc/my.cnf文件中指定socket=/tmp/mysql

防止多图OOM的核心解决思路就是使用LruCache技术

防止多图OOM的核心解决思路就是使用LruCache技术.但LruCache只是管理了内存中图片的存储与释放,如果图片从内存中被移除的话,那么又需要从网络上重新加载一次图片,这显然非常耗时.对此,Google又提供了一套硬盘缓存的解决方案:DiskLruCache(非Google官方编写,但获得官方认证).只可惜,Android Doc中并没有对DiskLruCache的用法给出详细的说明,而网上关于DiskLruCache的资料也少之又少,因此今天我准备专门写一篇博客来详细讲解DiskLruC