Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

对于给定的A和B,求A+B的值。

【输入格式】

输入文件aplusb.in的第1行为一个整数A,第2行为一个整数B。

【输出格式】

输出文件aplusb.out仅包括1行,A+B的值。

【数据规模】

对于100%的数据,A和B绝对值不超过10^100000,请注意A与B有可能为负数。

Sample Input1

1
1

Sample Output1

2

【样例说明】

1+1=2

【题解】

这是一道关于高精度加法和减法结合的题。

首先。我们用一个flag1和flag2两个bool型,来判断输入的A和B是否有负号。

如果探测到有负号,就直接删掉这个负号。

所以我们就获得了两个正数。

然后根据flag1和flag2来判断用哪一个减去哪一个

如果!flag1&&!flag2表示全都是正数。直接两个相加

如果flag1&&flag2表示全都是负数。输出一个负号,然后两个数相加。

如果flag1&&!flag2表示前面一个A是负数B是正数。则用B去减A(A去掉负号了);

如果!flag1&&flag2表示前面一个A是正数B是负数,则用A减去B(B去掉负号了);

在做减法的时候,要判断哪一个数比较大。然后要根据这个信息判断是否要输出负号。

【代码】

#include <cstdio>
#include <string>
#include <iostream> using namespace std; string s1,s2;
int a[200001],b[200001],c[200001] = {0}; void plu_s(string a1,string b1) //把a1和b1两个数相加
{
a[0] = a1.size(); //a1的长度
for (int i = 1;i <= a[0];i++)
a[i] = a1[a[0]-i]-'0';
b[0] = b1.size();
for (int i = 1;i <= b[0];i++)
b[i] = b1[b[0]-i]-'0';
int l = a[0];
if (b[0] > a[0])
l = b[0]; //l是两个数中长度更长的数的长度
int x = 0;
for (int i = 1;i <= l;i++) //一边处理进位,一边做加法
{
c[i] = a[i] + b[i] + x;
x = c[i] / 10;
c[i] = c[i] % 10;
}
while (x > 0) //如果还能够进位则进位
{
l++;
c[l] = x % 10;
x = x / 10;
}
c[0] = l; //同时增加c答案数字的长度
} bool can(string s1,string s2) //比较s1是否能够减s2即s1>=s2是否成立
{
if (s1.size() > s2.size()) //如果s1的长度更长,则一定成立
return true;
if (s1.size() < s2.size()) //如果s2的长度更长,则一定不成立
return false;
if (s1.size() == s2.size()) //如果两个数的长度一样 就要具体到比较每个数字了
{
for (int i = 1;i <= s1.size();i++)
if (s1[i] > s2[i]) //只要出现一个数字不相同就可以做出判断了
return true;
else
if (s1[i] < s2[i])
return false;
return true; //全都一样 也可以减
}
} void subtract(string a1,string b1) //做减法
{
a[0] = a1.size(); //获取数字长度 把数字的长度放在a[0]是一个不错的选择
for (int i = 1;i <= a[0];i++)
a[i] = a1[a[0]-i]-'0';
b[0] = b1.size();
for (int i = 1;i <= b[0];i++)
b[i] = b1[b[0]-i]-'0';
int l = a[0];//已经判断出来a是可以减去b的,所以用a的数字长度就好
for (int i =1;i<=l;i++)
{
c[i]= c[i] + a[i]-b[i]; //这里不能写成c[i]=a[i]-b[i] ;因为有借位的问题
if (c[i] < 0)
c[i]+=10,c[i+1]--;
}
while (c[l] == 0 && l >=2)
l--;
c[0] = l; //最后要记得把新的长度赋值给c[0]
} int main()
{
cin >> s1;
cin >> s2;
bool flag1 = false,flag2 = false; //得出A和B的正负情况
if (s1[0] == '-')
flag1 = true,s1 = s1.erase(0,1);
if (s2[0] == '-')
flag2 = true,s2 = s2.erase(0,1);
if (!flag1 && !flag2) //根据正负情况做相应的加减法
plu_s(s1,s2);
if (flag1 && flag2)
{
plu_s(s1,s2);
printf("-");
}
if (!flag1 && flag2) //第一个数为正数 第二个为负数 a-b
{
if (!can(s1,s2))
{
printf("-");
subtract(s2,s1);
}
else
subtract(s1,s2);
}
if (flag1 && !flag2) //第一个数为负数 第二个为正数 b-a
{
if (!can(s2,s1))
{
printf("-");
subtract(s1,s2);
}
else
subtract(s2,s1);
}
for (int i = c[0];i >=1;i--)
printf("%d",c[i]);
return 0;
}

【u216】A+B Problem(aplusb)的更多相关文章

  1. 【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划

    [BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...

  2. 洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)

    洛谷P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 刚学了FFT,我们来刷一道模板题. 题目描述 给定两个长度为 n 的两个十进制数,求它们的乘积. n<=100000 如 ...

  3. 【BZOJ1000】A+B Problem ★BZOJ1000题达成★

    [BZOJ1000]A+B Problem Description 输入两个数字,输出它们之和 Input 一行两个数字A,B(0<=A,B<100) Output 输出这两个数字之和 S ...

  4. 【题解】CF45G Prime Problem

    [题解]CF45G Prime Problem 哥德巴赫板子题? \(\frac{n(n+1)}{2}\)若是质数,则不需要分了. 上式 若是奇数,那么拆成2和另一个数. 上式 若是偶数吗,直接\(O ...

  5. 【BZOJ3218】a + b Problem 可持久化线段树优化建图

    [BZOJ3218]a + b Problem 题解:思路很简单,直接最小割.S->i,容量为Bi:i->T,容量为Wi:所有符合条件的j->new,容量inf:new->i, ...

  6. 【题解】P4137 Rmq Problem(莫队)

    [题解]P4137 Rmq Problem(莫队) 其实这道题根本就不用离散化! 因为显然有\(mex\)值是\(\le 2\times 10^5\)的,所以对于大于\(2\times 10^5\)的 ...

  7. 【HDU1402】【FFT】A * B Problem Plus

    Problem Description Calculate A * B. Input Each line will contain two integers A and B. Process to e ...

  8. 【HDU1000】A+B Problem

    题目来源:www.acm.hdu.edu.cn 题目编号:1000  A+B Problem /*----------------------------------------原题目-------- ...

  9. 【BZOJ】2301: [HAOI2011]Problem b(莫比乌斯+分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2301 和这题不是差不多的嘛--[BZOJ]1101: [POI2007]Zap(莫比乌斯+分块) 唯 ...

随机推荐

  1. <%%>创建内联代码块(表达式)

    其实<%%>很早之前就见过了,只是会用一点功能,其它的不甚了解.今天偶尔见到了它的庐山真面目,现在共享给大家. 语法 代码块呈现(<%%>)定义了当呈现页时执行的内联代码或内联 ...

  2. 开发过程使用Tomcat Maven插件持续快捷部署Web项目

    我在平时工作中部署Web项目到测试服务器上的Tomcat时用的是Hudson.Hudson本身已经跟SVN.Git.Maven集成并且支持添加各种插件.但如果使用Hudson,我需要配置两个任务:一个 ...

  3. Excel 下拉菜单制作

    废话少说吧,以图明示: 图1 操作步骤(环境为Office 2013) 备注,第四步,可以选择页面中的数据源,也可以以“,”分割的方式输入字符串 图2 制作效果

  4. 今天遇到奇怪的事:SVN本地代码的标记突然没了,Clean up也报错

    今天遇到奇怪的事:SVN本地代码的标记突然没了.Clean up也报错 脑子一想这样的情况,能够先把原来的文件夹改一个名字.又一次把代码check out下来,再合并提交更新,但这样也太LOW了吧 上 ...

  5. 电脑c盘清理

    https://www.cnblogs.com/btchenguang/archive/2012/01/20/2328320.html

  6. PythonOOP面向对象编程3

    override 函数重写 重写是在自定义的类内添加相应的方法,让自定义的类生成的对象(实例)像内建对象一样进行内建的函数操作 对象转字符串函数重写 repr(obj) 返回一个能代表此对象的表达式字 ...

  7. Machine Learning With Spark学习笔记(提取10万电影数据特征)

    注:原文中的代码是在spark-shell中编写运行的,本人的是在eclipse中编写运行,所以结果输出形式可能会与这本书中的不太一样. 首先将用户数据u.data读入SparkContext中.然后 ...

  8. self.view.layer.contents 和 self.view.backgroundColor

    一. self.view.layer.contents 和 self.view.backgroundColor 今天测了一下 :    self.view.layer.contents 和 self. ...

  9. js 第四章 cookie的操作

    js 第四章 cookie的操作 一.学习要点 掌握cookie的简单应用 二. js 第四章 cookie的操作 了解cookie 什么是cookie? cookie 是存储于访问者的计算机中的变量 ...

  10. Emacs常用快捷键

    基本命令 C-x C-f 打开/新建文件 C-x C-s 保存当前缓冲区 C-x C-w 当前缓冲区另存为 C-x C-v 关闭当前Buffer并打开新文件 C-x i 光标处插入文件 C-x b 切 ...