九度OJ 1037:Powerful Calculator(强大的计算器) (大整数运算)
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1821
解决:528
- 题目描述:
-
Today, facing the rapid development of business, SJTU recognizes that more powerful calculator should be studied, developed and appeared in future market shortly. SJTU now invites you attending such amazing research and development work.
In most business applications, the top three useful calculation operators are Addition (+), Subtraction (-) and Multiplication (×) between two given integers. Normally, you may think it is just a piece of cake. However, since some integers for calculation
in business application may be very big, such as the GDP of the whole world, the calculator becomes harder to develop.
For example, if we have two integers 20 000 000 000 000 000 and 4 000 000 000 000 000, the exact results of addition, subtraction and multiplication are:
20000000000000000 + 4000000000000000 = 24 000 000 000 000 000
20000000000000000 - 4000000000000000 = 16 000 000 000 000 000
20000000000000000 × 4000000000000000 = 80 000 000 000 000 000 000 000 000 000 000
Note: SJTU prefers the exact format of the results rather than the float format or scientific remark format. For instance, we need "24000000000000000" rather than 2.4×10^16.
As a programmer in SJTU, your current task is to develop a program to obtain the exact results of the addition (a + b), subtraction (a - b) and multiplication (a × b) between two given integers a and b.
- 输入:
-
Each case consists of two separate lines where the first line gives the integer a and the second gives b (|a| <10^400 and |b| < 10^400).
- 输出:
-
For each case, output three separate lines showing the exact results of addition (a + b), subtraction (a - b) and multiplication (a × b) of that case, one result per lines.
- 样例输入:
-
20000000000000000
4000000000000000
- 样例输出:
-
24000000000000000
16000000000000000
80000000000000000000000000000000
思路:
考察大整数运算中的加减乘法,涉及符号,更繁琐一些。
我的思路用一个含202个int的数组来表示一个数,每个数只存储4位。
(1)只存4位的原因是:如果5位,乘法运算时能到到10位,超过了int的表示范围。
(2)用202个而不是101个的原因是:乘法运算最大可能位数加倍。
最高位表示符号位,其他如果没有数就全置零。
加减法运算选择要看两个数的符号是否相同,并不给予原来算式中的加减法。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define N 202
#define M 10000 int prase(char s[], int a[])
{
memset(a, 0, N*sizeof(int));
int n = strlen(s);
int flag = 0;
if (s[0] == '-' || s[0] == '+')
{
if (s[0] == '-')
flag = 1;
s++;
n--;
} int i, j;
char t[5];
j = 0;
for (i=n-1; i>=0; i-=4)
{
int jj = 0;
for (int k=i-3; k<=i; k++)
{
if (k>=0)
t[jj++] = s[k];
}
t[jj] = '\0';
a[j++] = atoi(t);
}
a[N-1] = flag;
return j;
} void printA(int a[], int n)
{
int i;
for (i=n-1; i>=0; i--)
{
if (a[i] != 0)
break;
}
if (i < 0)
{
printf("0\n");
return ;
}
int flag = a[N-1];
if (flag == 1)
printf("-");
printf("%d", a[i]);
for (int j=i-1; j>=0; j--)
printf("%04d", a[j]);
printf("\n");
} int sub(int a[], int na, int b[], int nb, int c[])
{
int i;
for (i=0; i<na; i++)
{
if (a[i] < b[i])
{
a[i+1] --;
a[i] += M;
}
c[i] += a[i]-b[i];
}
for (i=na-1; i>=0; i--)
{
if (c[i] != 0)
break;
}
return i+1;
} int plus(int a[], int na, int flag, int b[], int nb, int c[])
{
memset(c, 0, N*sizeof(int));
int nm = (na > nb) ? na : nb;
int fa = a[N-1];
int fb = (b[N-1]+flag)%2;
int i; if (fa == fb)
{
for (i=0; i<=nm; i++)
{
c[i] += a[i] + b[i];
if (c[i] >= M)
{
c[i+1] ++;
c[i] -= M;
}
}
c[N-1] = fa;
if (c[nm] != 0)
return nm + 1;
else
return nm;
}
int ns;
for (i=nm; i>=0; i--)
{
if (a[i] != b[i])
break;
}
if (i < 0)
return 0;
if (a[i] > b[i])
{
ns = sub(a, na, b, nb, c);
c[N-1] = fa;
}
else
{
ns = sub(b, nb, a, na, c);
c[N-1] = fb;
}
return ns;
} int mult(int a[], int na, int b[], int nb, int c[])
{
memset(c, 0, N*sizeof(int));
int i, j, k;
for (i=0; i<na; i++)
{
for (j=0; j<nb; j++)
{
k = i+j;
c[k] += a[i]*b[j];
if (c[k] >= M)
{
c[k+1] += c[k]/M;
c[k] %= M;
}
}
}
c[N-1] = (a[N-1]+b[N-1])%2;
for (i=na+nb; i>=0; i--)
{
if (c[i] != 0)
break;
}
return i+1;
} int main(void)
{
char sa[2*N], sb[2*N];
int na, nb;
int a[N], b[N];
int np, ns, nm;
int p[N], s[N], m[N]; while (scanf("%s%s", sa, sb) != EOF)
{
na = prase(sa, a);
nb = prase(sb, b);
//printA(a, na);
//printA(b, nb); np = plus(a, na, 0, b, nb, p);
printA(p, np); ns = plus(a, na, 1, b, nb, s);
printA(s, ns); nm = mult(a, na, b, nb, m);
printA(m, nm);
} return 0;
}
/**************************************************************
Problem: 1037
User: liangrx06
Language: C
Result: Accepted
Time:0 ms
Memory:916 kb
****************************************************************/
九度OJ 1037:Powerful Calculator(强大的计算器) (大整数运算)的更多相关文章
- 九度OJ 1340:小A的计算器 (进制转换)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:735 解决:202 题目描述: 以往的操作系统内部的数据表示都是二进制方式,小A新写了一个操作系统,系统内部的数据表示为26进制,其中0-2 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ 1502 最大值最小化(JAVA)
题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...
- 九度OJ,题目1089:数字反转
题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...
- 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...
- 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...
- 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)
题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...
- 九度OJ 1371 最小的K个数 -- 堆排序
题目地址:http://ac.jobdu.com/problem.php?pid=1371 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4 ...
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
随机推荐
- OnTouchListener
1.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
- mysql事物中行锁与表锁
事物与锁 什么叫不支持事物: 首先要了解数据库里的事务是什么意思.事务在计算机数据库里 :在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).在关系数据库中,一个事务可以 ...
- log4j 2使用properties文件进行配置
网上不少文章给的都是用xml进行配置,也会提到无法使用properties文件对log4j进行配置,但那应该只是在他们写文章的时候才是如此,最新的2.8.2版本经过我试验后是可以做到的当然该文件最好放 ...
- C#中结构体与类的区别
一.结构体和类非常相似 1,定义和使用非常相似,例子如下:public struct Student{ string Name; int Age;}public class Questio ...
- Android常用URI收藏
转:http://www.android-study.com/jichuzhishi/338.html 以下是常用到的Intent的URI及其示例,包含了大部分应用中用到的共用Intent 一.打开一 ...
- Spark HA模式访问Hadoop HA下的数据
首先是需要将hadoop的配置文件core-site,xml和hdfs-site.xml 拷贝到Spark conf目录下 然后启动提交即可 spark-submit \ --master spark ...
- Linux学习之十二-Linux文件属性
Linux文件属性 在Linux中,对于每个文件都有相应属性,以Linux中root用户家目录下新建文件a.txt为例,在a.txt中输入几个字符 使用命令ls -ild a.txt查看文件的权限等 ...
- 基于maven+dubbo+spring+zookeeper的简单项目搭建
maven下搭建dubbo小demo,供初学者学习,有不正确地方还请见谅. 先推荐一篇创建maven项目的文章,个人认为比较完整详细清楚: http://www.cnblogs.com/leiOOle ...
- Testin云測手游质量管家 七大兵器助CP称霸江湖
Testin云測手游质量管家 七大兵器助CP称霸江湖 2014/09/29 · Testin · 产品评測 在武侠江湖里,高手不须要武功高强.亦要具备厉害的武器.有人的地方就有江湖.手游行业相同腥风血 ...
- UNP学习笔记(第一章 简介)
环境搭建 1.下载解压unpv13e.tar.gz 2.进入目录执行 ./configurecd lib //进入lib目录make //执行make命令 3.将生成的libunp.a静态库复制到/u ...