高精度运算之加减乘

大数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;
}

时间: 2024-08-03 12:05:27

高精度运算之加减乘的相关文章

字符串大数加减运算问题

这里自己利用STL模板中的容器和链表实现字符串大数加减运算. 1 #include<iostream> 2 #include<vector> 3 #include<list> 4 using namespace std; 5 6 list<char> Input_Number(list<char> ilist)//输入链表字符串,以‘#’作为结束符 7 { 8 cout<<"please Input string ,end

转:JS日期加减,日期运算

原文 出处http://hi.baidu.com/tonlywang/item/685fba8933a2a756e73d1950 一.日期减去天数等于第二个日期 function cc(dd,dadd) ...{ //可以加上错误处理 var a = new Date(dd) a = a.valueOf() a = a - dadd * 24 * 60 * 60 * 1000 a = new Date(a) alert(a.getFullYear() + "年" + (a.getMon

C_BigDecimal_加减运算

首先举个例子说说思路: 输入str1:1.341   str2:11.2  在C语言中存储字符串的直接是字符型数组,strlen(str)代表字符串的长度(那个小数点也要算的),则str1,str2的长度为5和4.而浮点数加减运算时遵循从右往左计算,所以首先要使得字符串格式化.找到并返回存储字符串中小数点的下标,str1,str2小数点位置下标为1和2,然后用字符串长度减去即可求出小数点后的位数差,通过循环将短的加0补齐,为1.341,11.200,最后按最长长度循环将字符从右依次赋值给自定的c

linux date 加减运算

在linux shell编程中,经常用到日期的加减运算 查看时间: [[email protected] ~]# date Fri Sep  2 13:12:56 CST 2016 修改时间: [[email protected] ~]# date -s "1980-01-01 00:00:00" Tue Jan  1 00:00:00 CST 1980 其实date命令本身提供了日期的加减运算 非常方便.例如:得到昨天的时间date +%Y%m%d --date="-1 d

让文本框支持加减运算的实现方法

一个网页表单效果,让表单内的文本框支持加减运算,不过你要按正确的运算式输入,要不然它没有那么智能哦,比如输入1+5,文本框旁边会显示计算结果,这要归功于JavaScript的功能. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=&

poj 2756 Autumn is a Genius 高精度加减

题意: 求a+b.-10^50000<a,b<32768. 分析: 题目描述很猥琐,其实要用高精度的,用高精度加减模板. 代码: //poj 2756 //sep9 #include <iostream> using namespace std; const int maxN=60000; char A[maxN],B[maxN]; int L,flag1,flag2,flag3,a[maxN],b[maxN],c[maxN]; void ini() { L=max(strlen(

Oracle 如何对时间进行简单加减运算

在我们用dbms_job包进行定时Job的时候,需要设置时间间隔,所以需要知道时间的基本加减方法. SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 会话已更改. SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual; --分别是加一小时,一分钟,一秒钟 SYSDATE SYSDATE+1/24 SYSDATE+

浮点加减运算中左规右规问题

当尾数用二进制表示时,浮点规格化的定义是尾数M应满足:  1/2   ≤  |M|<1 显然对于正数而言,有M = 00.1φφ-φ:对于负数,其补码形式为11.0φφ-φ(即-0.0*******,左归).这样,当进行补码浮点加减运算时,只要对运算结果的符号位和小数点后的第一位进行比较:如果它们不等,即为00.1φφ-φ或11.1φφ-φ,就是规格化的数:如果它们相等,即为00.0φφ-φ或11.0φφ-φ,就不是规格化的数,在这种情况下需要尾数左移以实现规格化的过程,叫做向左规格化.规则是:

Leetcode 592.分数加减运算

分数加减运算 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1.所以在上述例子中, 2 应该被转换为 2/1. 示例 1: 输入:"-1/2+1/2" 输出: "0/1"  示例 2: 输入:"-1/2+1/2+1/3" 输出: "1/3" 示例 3: 输入:"1/3-1/