您的位置:首页 > 其它

高精度运算之加减乘

2015-10-09 19:45 274 查看
大数A+B A-B A*B;

在A-B是要判断AB的大小,我们要用大数减小数;

下面是我们oj的一个A*B的题;

链接:http://acm.zznu.edu.cn/problem.php?id=1562

题目描述

Redraiment碰到了一个难题,需要请你来帮忙:给你两个整数,请你计算A × B。

输入

数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数。 接着有T组数据,每组数据只有一行,包括两个正整数A和B。 但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。 但A和B的位数最大不会超过100位。

输出

对应每组测试数据,你都要输出两行: 第一行为:"Case #:", # 代表这是第几组测试数据。 第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果。 你要注意这个等式里包含了几个空格。 要求每组数据之间都需要保留一个空行。

样例输入

2
1 2
123456789 987654321

样例输出

Case 1:
1 * 2 = 2

Case 2:
123456789 * 987654321 = 121932631112635269


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
#define N 1100

void change(char s[], int a[])///把字符串类型的s转化成数字倒着存入a中;
{
int j=0, len = strlen(s);
for(int i=len-1; i>=0; i--)
{
a[j++] = s[i]-'0';
}
}
void Add(int a[], int b[], int sum[])
{
for(int i=0; i<N-1; i++)
{
int m = sum[i]+a[i]+b[i];
sum[i] = m%10;
sum[i+1] += m/10;
}
}
void Sub(int a[], int b[], int c[])
{
for(int i=0; i<N; i++)
{
if(a[i]-b[i] < 0)///借位;
{
c[i] = a[i]+10-b[i];
a[i+1] -= 1;
}
else
c[i] = a[i] - b[i];
}
}
void Mul(int a[], int b[], int c[])
{
int m;
for(int i=0; i<N; i++)
{
for(int j=0; i+j+1<N; j++)
{
m = a[i]*b[j];
m+=c[i+j];
c[i+j] = m%10;
c[i+j+1] += m/10;
}
}
}
int main()
{
int T, t=1, i, f, a
, b
, c
;
char s1
, s2
;
scanf("%d", &T);
while(T--)
{
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
f  =0;
scanf("%s%s", s1,s2);

int len1 = strlen(s1);
int len2 = strlen(s2);

/* if(len1<len2)
{
f=1;
swap(s1, s2);
}
else
{
if(strcmp(s1, s2)<0)
f=1,
swap(s1, s2);
}*////在减法中要用到这个;
change(s1, a);
change(s2, b);

/// Add(a, b, c);/// +
/*Sub(a, b, c);/// -
if(f == 1) printf("-"); */
Mul(a, b, c);/// *
for(i=N-1; i>0; i--)
{
if(c[i]!=0)
break;
}
printf("Case %d:\n", t++);
printf("%s * %s = ", s1, s2);
for(int j=i; j>=0; j--)
printf("%d", c[j]);
printf("\n");
if(T!=0)
printf("\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: