POJ 2756 Autumn is a Genius 大数加减法
Description
Input
Output
Sample Input
1
1 2
Sample Output
3
Hint
本题题目没明白说明有多大的数,主要是A, B < 32768迷惑人,好像不是大数,只是后面 The size of input will not exceed 50K 的这句话就说明是大数了能够为接近无穷大的负数。
事实上50K就应该开多大的数组呢?50 * 1024 / 8 == 6400,所以会有6400个数位。
这里直接使用C++的vector或者string,然后输入使用buffer,那么就能够无论数位有多大了。
大数加法比較easy。假设是减法那么题目就比較麻烦了。眼下还想不到比較简洁的解法。要特殊处理符号,并且本题是两个数都可能是负数,那么就要分开情况讨论了,符号不同。绝对值大小不同都须要不同处理。情况分的好。那么程序就会相对简洁点。
#include <stdio.h>
#include <string>
#include <algorithm>
#include <vector>
using namespace std; const int MAX_BUF = 512;
int id = 0, len = 0;
char buf[MAX_BUF]; char getFromBuf()
{
if (id >= len)
{
len = fread(buf, 1, MAX_BUF, stdin);
id = 0;
}
return buf[id++];
} void getNum(vector<short> &num)
{
char c = getFromBuf();
while (('\n' == c || ' ' == c) && len) c = getFromBuf();
while ('\n' != c && ' ' != c && len)
{
num.push_back(c-'0');
c = getFromBuf();
}
} void addBigNum(vector<short> &rs, vector<short> &A, vector<short> &B)
{
rs.clear();
if (A.empty())
{
rs = B;
return;
}
if (B.empty())
{
rs = A;
return;
}
int an = A[0] == '+'-'0' || A[0] == '-'-'0'? 1:0;
int bn = B[0] == '+'-'0' || B[0] == '-'-'0'? 1:0;
short carry = 0;
int i = (int)A.size()-1;
int j = (int)B.size()-1;
for (; i >= an || j >= bn || carry; i--, j--)
{
short a = i >= an? A[i] : 0;
short b = j >= bn? B[j] : 0;
carry += a + b;
rs.push_back(carry % 10);
carry /= 10;
}
reverse(rs.begin(), rs.end());
} void minusBigNum(vector<short> &rs, vector<short> &A, vector<short> &B)
{
rs.clear();
if (B.empty())
{
if (A.empty()) return;
int i = A[0] == '-'-'0' || A[0] == '+'-'0'? 1 : 0;
for (; i < (int)A.size(); i++) rs.push_back(A[i]);
return ;
}
int an = A[0] == '-'-'0' || A[0] == '+'-'0' ? 1 : 0;
int bn = B[0] == '-'-'0' || B[0] == '+'-'0' ? 1 : 0; short carry = 0;
int i = (int)A.size() - 1;
int j = (int)B.size() - 1;
for (; i >= an || j >= bn || carry != 0; i--, j--)
{
short a = i >= an ? A[i] : 0;
short b = j >= bn ? B[j] : 0;
if (a > b)
{
short sum = a - b - carry;
carry = 0;
rs.push_back(sum);
}
else if (a < b)
{
short sum = 10 - (b - a) - carry;
carry = 1;
rs.push_back(sum);
}
else
{
short sum = 0;
if (carry) sum = 9;
rs.push_back(sum);
}
}
reverse(rs.begin(), rs.end());
} int cmp(vector<short> &A, vector<short> &B)
{
int an, bn;
if (A.empty()) an = 0;
else an = A[0] == '-'-'0' || A[0] == '+'-'0'? A.size()-1 : A.size();
if (B.empty()) bn = 0;
else bn = B[0] == '-'-'0' || B[0] == '+'-'0'? B.size()-1 : B.size(); if (an > bn) return 1;
if (an < bn) return -1;
if (!an) return 0; int i = A[0] == '-'-'0' || A[0] == '+'-'0'? 1 : 0;
int j = B[0] == '-'-'0' || B[0] == '+'-'0'? 1 : 0; int res = 0;
for (; i < (int)A.size(); i++, j++)
{
if (A[i] < B[j]) res = -1;
else if (A[i] > B[j]) res = 1;
if (res != 0) break;
}
return res;
} int main()
{
int T;
scanf("%d", &T);
while (T--)
{
vector<short> A, B, rs;
getNum(A);
getNum(B); bool Asign = true, Bsign = true;
if (!A.empty() && A[0] == '-'-'0') Asign = false;
if (!B.empty() && B[0] == '-'-'0') Bsign = false;
if (Asign == Bsign)
{
addBigNum(rs, A, B);
if (!Asign) putchar('-');
}
else
{
int c = cmp(A, B);
if (0 == c) rs.push_back(0);
else if (c < 0)
{
minusBigNum(rs, B, A);
if (!Bsign) putchar('-');
}
else
{
minusBigNum(rs, A, B);
if (!Asign) putchar('-');
}
}
for (int i = 0; i < (int)rs.size(); i++)
{
printf("%d", rs[i]);
}
putchar('\n');
}
return 0;
}
POJ 2756 Autumn is a Genius 大数加减法的更多相关文章
- POJ 2756 Autumn is a Genius 采用string大数减法
标题意味着小神童.加减可以计算. 只是说这个小神童的学科知识,究竟有多神,自己给自己找. 最后,因为数据是非常非常巨大的,我听说关闭50k结束了50000数字总和,可以想见他神教. 这似乎也是考试题目 ...
- POJ 2389 Bull Math(水~Java -大数相乘)
题目链接:http://poj.org/problem?id=2389 题目大意: 大数相乘. 解题思路: java BigInteger类解决 o.0 AC Code: import java.ma ...
- poj 2506 Tiling(递推 大数)
题目:http://poj.org/problem?id=2506 题解:f[n]=f[n-2]*2+f[n-1],主要是大数的相加; 以前做过了的 #include<stdio.h> # ...
- POJ 3982 序列(JAVA,简单,大数)
题目 //在主类中 main 方法必须是 public static void 的,在 main 中调用非static类时会有警告信息, //可以先建立对象,然后通过对象调用方法: import ja ...
- POJ 2413 How many Fibs?#二分+大数加法
http://poj.org/problem?id=2413 #include<iostream> #include<cstdio> #include<cstring&g ...
- POJ 2635 The Embarrassed Cryptographer(大数求余)
题意:给出一个大数,这个大数由两个素数相乘得到,让我们判断是否其中一个素数比L要小,如果两个都小,输出较小的那个. 分析:大数求余的方法:针对题目中的样例,143 11,我们可以这样算,1 % 11 ...
- 大数加减法 - java实现
计算机处理的各种数据类型都有个范围,超出范围的就处理不了. 如果做超大数运算加减乘除,普通方法肯定是不行的,那么我们遇到大数的运算怎么处理呢?今天介绍一种大数加减乘除运算的方法 思路: 1. 将两个特 ...
- POJ 3181 Dollar Dayz ( 完全背包 && 大数高精度 )
题意 : 给出目标金额 N ,问你用面额 1~K 拼成 N 的方案有多少种 分析 : 完全背包的裸题,完全背包在 DP 的过程中实际就是列举不同的装填方案数来获取最值的 故状态转移方程为 dp[i] ...
- 从一道NOI练习题说递推和递归
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...
随机推荐
- U盘只剩下快捷方式
原理: 其实,这个是一种叫1KB病毒(也称之为快捷方式病毒.风暴一号)惹的祸,它是一种恶意的蠕虫病毒,执行以下恶意操作:1.当你的U盘放到一个已经被感染 的主机上时,主机(我的电脑)上的病毒体进程首先 ...
- ZOJ 1542 POJ 1861 Network 网络 最小生成树,求最长边,Kruskal算法
题目连接:problemId=542" target="_blank">ZOJ 1542 POJ 1861 Network 网络 Network Time Limi ...
- wpf集成unity
定义一个帮助类 实际上就是为了设置以下这两种属性 安全性信任和从html中可见的属性 即: 在html的javaScript中可用 window.external.方法名来调用C#方法 [Pe ...
- Servlet过滤器——使用过滤器禁止浏览器缓存页面
1.概述 IE缓存虽然能提高已储存网站的访问速度,但是过度的IE缓存会影响浏览器的响应速度.同时还可能为网站的运行带来一些不必要的麻烦.例如:可能会因为浏览器缓存的应用,而导致Web服务器不能准确的计 ...
- innerXml,outerXml,innerText的不同
原文:innerXml,outerXml,innerText的不同 昨天看到咱们园子里有一个仁兄写的关于xml的有关操作,在读的过程中,由于是初学者有不明白的地方就查资料,发现自己多innerXml, ...
- 让盘古分词支持最新的Lucene.Net 3.0.3
原文:让盘古分词支持最新的Lucene.Net 3.0.3 好多年没升级过的Lucene.Net最近居然升级了,到了3.0.3后接口发生了很大变化,原来好多分词库都不能用了,所以上次我把MMSeg给修 ...
- HTML 页面载入 Flash 插件的几种方法
前言 之所以写这篇文章,主要是由于组长给提的一个新的需求--使用浏览器调用电脑的摄像头,来实现即时拍照的功能.在网上查了非常多资料,由于这样那样的原因,终于选择了使用flash插件来调用pc的摄像头. ...
- hdu 4708 Rotation Lock Puzzle 2013年ICPC热身赛A题 旋转矩阵
题意:给出一个n*n的矩阵,旋转每一圈数字,求出对角线可能的最大值,以及转到最大时的最小距离. 只要分析每一层就可以了,本来想用地址传递二维数组,发现行不通,改了一下就行了. 这里有个坑,比如: 1 ...
- (step6.3.2)hdu 1068(Girls and Boys——二分图的最大独立集)
题目大意:第一行输入一个整数n,表示有n个节点.在接下来的n行中,每行的输入数据的格式是: 1: (2) 4 6 :表示编号为1的人认识2个人,他们分别是4.6: 求,最多能找到多少个人,他们互不认识 ...
- Swift - 操作表(UIActionSheel)的用法,也叫底部警告框
1,下面创建一个操作表(或叫底部警告框)并弹出显示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class ViewController: UIViewC ...