大数相加相乘

用乘法行列式多次相乘多次相加,时间复杂度为O(nm),n,m分别为两个数字长度。

#include<stdio.h>
#include<iostream>
#include<string>
#include<sstream>
using namespace std;

string a,b,ans,zero,product;///输入a,b,ans是最终答案,zero是乘法行列式补零用的,product暂时存储单位数乘积
int len1,len2,cha,maxx;
int s,r;///s是本位,r是进位

string add(string a,string b)///字符串大数相加
{
    string res="";
    s=0;r=0;
    len1=a.size();
    len2=b.size();

    if(len1>=len2)
    {
        cha=len1-len2;
        for(int i=0;i<cha;i++)
            b="0"+b;
    }
    else
    {
        cha=len2-len1;
        for(int i=0;i<cha;i++)
            a="0"+a;
    }
    maxx=max(len1,len2);
    for(int i=maxx-1;i>=0;i--)
    {
        s=(a[i]-‘0‘+b[i]-‘0‘+r)%10;///先加上上次的进位
        r=(a[i]-‘0‘+b[i]-‘0‘+r)/10;///本次进不进位,进位则是1,不进位则是0
        res=(char)(s+‘0‘)+res;
    }
    if(r)
        res="1"+res;    ///最左边需不需要进位
    return res;
}

string trans(int a)  ///整型转化为string型,需要头文件sstream
{
    stringstream ss;///中转站
    string res;
    ss<<a;
    ss>>res;
    return res;
}

string multiplication(string a,char b)///字符串数字*单个字符
{
    s=r=0;
    string res="";
    int x,y=b-‘0‘;
    int len=a.size();
    for(int i=len-1;i>=0;i--)
    {
        x=a[i]-‘0‘;
        s=(x*y+r)%10;
        r=(x*y+r)/10;
        res=(char)(s+‘0‘)+res;
    }
    if(r)
        res=char(r+‘0‘)+res;
    return res;
}

int main()
{
    int t;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        cin>>a>>b;
        ans="";
        zero="";
        len2=b.size();
        for(int j=len2-1;j>=0;j--)
        {
            product=multiplication(a,b[j])+zero;
            ans=add(ans,product);
            zero=zero+‘0‘;  ///每往左进一位,乘法多补一个0
        }
        cout<<ans<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/shoulinniao/p/10258294.html

时间: 2024-10-25 02:20:04

大数相加相乘的相关文章

大数相加相乘及阶乘

大数的相加相乘和阶乘操作都可能会导致结果的溢出,可以把它们转换成字符串,再进行运算,这里需要注意的是,习惯上的加法乘法运算都是从低位开始运算的,先计算个位,个位向高位进位,依次进行直到最高位.字符串表示一个数字的时候如"3476",它的低位数字在最大下标处,为了与习惯上的操作保持一致,可以先把字符串反转,求出结果之后再把结果反转回来即可.接下来的加法操作就使用了反转的方法,乘法操作也可以使用类似的反转,但本文的乘法操作没有使用反转.计算出的结果可以保存在字符串中,也可以保存在整型的数组

求解Catalan数,(大数相乘,大数相除,大数相加)

Catalan数 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜密率捷法>最早用到"卡塔兰数",远远早于卡塔兰.有中国学者建议将此数命名为"明安图数"或"明安图-卡塔兰数".卡塔兰数的一般公式为 C(2n,n)/(n+1). 性质: 令h(0)=1,h(1)=1,卡塔兰数满足递归式: h(n)= h(0)*

大数相乘和大数相加。

/* *大数相乘 求n的阶乘. */ import java.math.BigInteger;import java.util.Scanner; public class BigMultiply { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); System.out.println(calcM(N)); } public static Stri

高精度问题之大数相加(原来就是用字符串相加,模拟手算这么简单!)

解题心的: 就是基本的一对一模拟手算..借助c++的string 不用逆序运算了.很方便的补0.  最后处理下前导0的问题. #include <iostream> #include <string> using namespace std; // 实现大数相加 结果存放在num中 void bigIntergerAdd(string &num, string add) { int goBit = 0; // 存放进位 // 先交换下顺序 加数的位数要比较少 if (num

SOJ 1002/1003/1004 大整数相加/相乘/相除

三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反过来想到了这几个题目.用JAVA写了以后果然很简单. 1002:大数相加: AC代码: import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { // TO

java-两个大数相加

题目要求:用字符串模拟两个大数相加. 一.使用BigInteger类.BigDecimal类 public static void main(String[] args) { String a="8888899999999888";  String b="88888888888888";  String str=new BigInteger(a).add(new BigInteger(b)).toString();  System.out.println(str);

HDU 1047 Integer Inquiry 大数相加 string解法

本题就是大数相加,题目都不用看了. 不过注意的就是HDU的肯爹输出,好几次presentation error了. 还有个特殊情况,就是会有空数据的输入case. #include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #include <limits.h

模板,大数相加

char a[Max],b[Max],c[Max],sum[Max]; void jia(char str1[],char str2[]) { int i,j,k,z; k=0;z=0; for(i=strlen(str1)-1,j=strlen(str2)-1;i>=0||j>=0;i--,j--) //核心,加法以及进位 { if(i>=0) z+=str1[i]-'0'; if(j>=0) z+=str2[j]-'0'; c[k++]=z%10+'0'; z=z/10; }

两个大数相加 ----Javascrit 实现

(function(){ var addLarge = function(n1,n2){ var over = 0; var ret = ""; var len = Math.min(n1.length,n2.length); var sln1 = n1.substr(n1.length - len,n1.length ); var sln2 = n2.substr(n2.length - len,n2.length ); for(var i = len;i > 0; i--)