码迷,mamicode.com
首页 > 其他好文 > 详细

高精度运算之加减乘

时间:2015-10-09 21:10:47      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:

大数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[N], b[N], c[N];
    char s1[N], s2[N];
    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

 

高精度运算之加减乘

标签:

原文地址:http://www.cnblogs.com/zhengguiping--9876/p/4864922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!