时间限制: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
来源:
2007年上海交通大学计算机研究生机试真题

思路:

考察大整数运算中的加减乘法,涉及符号,更繁琐一些。

我的思路用一个含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
****************************************************************/

最新文章

  1. VB.NET设置控件和窗体的显示级别
  2. [No000061]&quot;别人&quot;凭什么要帮你?&amp;理解中国人的人际和谐&amp;外人、自己人与另一半
  3. protected的使用注意
  4. DataTable常用操作
  5. String类的方法2
  6. (转)在iOS中使用icon font
  7. http://venkatbaggu.com/file-upload-in-asp-net-mvc-using-dropzone-js-and-html5/
  8. 如何禁用easyui-linkbutton 中的Click事件
  9. WPF中实现类智能感知
  10. Bash On Windows的学习
  11. JVM(一)JVM的基本结构
  12. 盼盼Degenerate——清除浮动的方法
  13. 读取Excel,单元格内容大于255个字符自动被截取的问题
  14. python的可变对象与不可变对象
  15. 【webpack】中clean-weabpack-plugin使用方法
  16. LeetCode--No.013 Roman to Integer
  17. Sitecore标准模板字段
  18. Android Socket
  19. (转)st(state-threads) coroutine调度
  20. 20155321 2016-2017-2 《Java程序设计》第二周学习总结

热门文章

  1. luogu P1214 [USACO1.4]等差数列 Arithmetic Progressions
  2. (入门SpringBoot)SpringBoot后台验证(八)
  3. dedecms跳转标签
  4. 更换 mac时 开发证书
  5. EasyMvc入门教程-基本控件说明(13)选项卡导航
  6. (转)python request用法
  7. centos7 下编译ffmpeg
  8. android ANR产生原因和解决的方法
  9. Python setup.py和MANIFEST.in文件
  10. Vue 内容分发slot