华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1540|回复: 0
打印 上一主题 下一主题

带小数的加法

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-4-13 21:09:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此题用来训练字符串的使用技巧是非常合适的。有些我们人的做事方法和机器是不一样的,要非常注意。
  1. #include<iostream>
  2. using  namespace std;
  3. string s1,s2,s3;
  4. int i,j,xx1,xx2,xx3;
  5. int l1,l2,p1,p2,x1,x2,z1,z2;
  6. int main()
  7. {
  8.     cin>>s1>>s2;
  9.     ///用字符串的唯一目的就是读入方便
  10.     l1=s1.size(),l2=s2.size();
  11.     p1=s1.find('.',0),p2=s2.find('.',0); ///找到小数点的位置,记下来
  12.     z1=p1,z2=p2;///记录整数部分的长度
  13.     x1=l1-p1-1,x2=l2-p2-1; ///记录小数部分的长度
  14.     if (z1<z2) for (i=1; i<=z2-z1; i++) s1='0'+s1;
  15.     else for (i=1; i<=z1-z2; i++) s2='0'+s2;
  16.     if (x1<x2) for (i=1; i<=x2-x1; i++) s1=s1+'0';
  17.     else for (i=1; i<=x1-x2; i++) s2=s2+'0';
  18.      ///整数部分和小数部分分别对齐
  19.     cout<<s1<<endl<<s2<<endl;
  20.     int p3=s1.find('.',0); ///记录结果的小数位置
  21.     s1.erase(p3,1),s2.erase(p3,1); ///删除掉小数点
  22.     l1=s1.size();
  23.     j=0; ///进位
  24.     for (i=l1-1; i>=0; i--)
  25.         ///从右往左加
  26.     {
  27.         xx1=s1[i]-'0';///字符变数字
  28.         xx2=s2[i]-'0';
  29.         xx3=xx1+xx2+j;
  30.         if(xx3>=10)(j=1,xx3-=10);///进位处理
  31.         else (j=0);
  32.         s3=char(xx3+'0')+s3;
  33.         ///数字变字符并加在结果左边
  34.     }
  35.     s3.insert(p3,"."); ///添加小数点
  36.     if (j==1) s3='1'+s3; ///首位进位处理
  37.     while (s3[s3.size()-1]=='0') s3.erase(s3.size()-1,1);///删除末尾的0
  38.     if (s3[s3.size()-1]=='.') s3.erase(s3.size()-1,1); ///最末尾是小数点也删掉
  39.     cout<<s3;
  40.     return 0;
  41. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-27 04:16 , Processed in 0.118802 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表