高精度加法和乘法

今天偶然看了一下某大神的模板,不经意翻到这个就顺便“借”了一下
上代码吧:

/*
Date : 2015-8-21 晚上
Author : ITAK

Motto :

今日的我要超越昨日的我,明日的我要胜过今日的我;
以创作出更好的代码为目标,不断地超越自己。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
/**
如何用:
1、变量声明:可以给初值,如:BigInt ans=100;
             可以不给初值(默认为0),如BigInt ans;
2、计算:可以连个BigInt对象相乘,相加;ans+ans*ans;
         也可以和整数相乘相加,如:ans+78*ans;
*/

struct BigInt
{
    const static int mod = 10000;
    const static int DLEN = 4;
    int a[600],len;
    BigInt()
    {
        memset(a,0,sizeof(a));
        len = 1;
    }
    BigInt(int v)
    {
        memset(a,0,sizeof(a));
        len = 0;
        do
        {
            a[len++] = v%mod;
            v /= mod;
        }
        while(v);
    }
    BigInt(const char *s)
    {
        memset(a,0,sizeof(a));
        int L = strlen(s);
        len = L/DLEN;
        if(L%DLEN)
            len++;
        int index = 0;
        for(int i=L-1; i>=0; i-=DLEN)
        {
            int t = 0;
            int k = i-DLEN+1;
            if(k<0)
                k = 0;
            for(int j=k; j<=i; j++)
                t = t*10+s[j]-'0';
            a[index++] = t;
        }
    }
    BigInt operator +(const BigInt &b)const
    {
        BigInt res;
        res.len = max(len,b.len);
        for(int i=0; i<=res.len; i++)
        {
            res.a[i] = 0;
        }
        for(int i=0; i<res.len; i++)
        {
            res.a[i] += ((i<len)?a[i]:0)+((i<b.len)?b.a[i]:0);
            res.a[i+1] += res.a[i]/mod;
            res.a[i] %= mod;
        }
        if(res.a[res.len]>0)
            res.len++;
        return res;
    }
    BigInt operator *(const BigInt &b)const
    {
        BigInt res;
        for(int i=0; i<len; i++)
        {
            int up = 0;
            for(int j=0; j<b.len; j++)
            {
                int temp = a[i]*b.a[j]+res.a[i+j]+up;
                res.a[i+j] = temp%mod;
                up = temp/mod;
            }
            if(up != 0)
                res.a[i+b.len] = up;
        }
        res.len = len+b.len;
        while(res.a[res.len-1]==0 && res.len>1)res.len--;
        return res;
    }
    void output()
    {
        printf("%d",a[len-1]);
        for(int i=len-2; i>=0; i--)
            printf("%04d",a[i]);
        printf("\n");
    }
};  
时间: 2025-01-21 08:45:44

高精度加法和乘法的相关文章

c++高精度加法求改错……

问题描述 c++高精度加法求改错-- #include<iostream> #include<cstring> using namespace std; const int maxn = 1000 + 10; int main(){ int t, count = 1; cin >> t; while (t--){ char m[maxn], n[maxn]; cin >> m >> n; int a[maxn], b[maxn], c[maxn]

c++-稀疏矩阵应用(加法、乘法、转置)

问题描述 稀疏矩阵应用(加法.乘法.转置) 要求用C++编写实现三元组,十字链表下的稀疏矩阵的加.转.乘的实现.(1)稀疏矩阵的存储(2)稀疏矩阵加法(3)矩阵乘法(4)矩阵转置 求各位大神指点!!!求源代码,最好有注释 解决方案 参考:http://www.docin.com/p-199942790.htmlhttp://www.doc88.com/p-8062287649250.html 解决方案二: 广义表的应用--稀疏矩阵的快速转置(三元组) 解决方案三: 表示我们只用C语言写过这个东西

使用C++的string实现高精度加法运算的实例代码_C 语言

对于超大数字的运算,用long long int仍然不能解决,这时候就需要考虑通过模拟运算和数组存储来实现高精度运算. 本文讨论借助C++的string来实现高精度的运算. 首先输入的量直接存储为string,设为s1和s2. 接下来设计一个反转函数,用于把整个字符串反转(为了方便后续计算). string reverseStr(string input){ string output = ""; for(int i = 0; i < input.length(); i++){

(PHP实现)只使用++运算实现加法,减法,乘法,除法

加法 复制代码 代码如下: function jiafa($a,$b) { for($i=0;$i<$b;$i++) { $a++; } return $a; } //echo jiafa(4,2); 减法 复制代码 代码如下: function jianfa($a,$b) { $c=0; while($b!=$a) { $b++; $c++; } echo $c; } // end func //jianfa(10,3); 乘法 复制代码 代码如下: function chengfa($a,$

大数加法和乘法

#include<iostream> #include<cstdio> #include<cstring> const int Len=5000//大数的长度 using namespace std; int Input (char n[])//将大数读入的函数 { char s[Len]; int l; for(int i=0; i<Len; i++) n[i]=0; if(scanf("%s",s)<1) return -1; l=

(PHP实现)只使用++运算实现加法,减法,乘法,除法_php技巧

加法 复制代码 代码如下: function jiafa($a,$b){ for($i=0;$i<$b;$i++) {  $a++; } return $a;}//echo jiafa(4,2); 减法 复制代码 代码如下: function jianfa($a,$b){ $c=0;    while($b!=$a) {  $b++;  $c++; } echo $c;} // end func//jianfa(10,3); 乘法 复制代码 代码如下: function chengfa($a,$

超大正整数加法与乘法最笨方法实现

using System.Text; private string AddNumber(string numA, string numB) { int lenA=0, lenB=0; int lenI=0, intTen=0; int intA=0, intB=0; StringBuilder result=new StringBuilder(""); lenA=numA.Length; lenB=numB.Length; if(lenA>lenB) lenI=lenA; els

java 写 高精度加法 HDU1002

import java.util.*; import java.math.*; import java.io.*; public class Main { public static void main( String[] args ) { Scanner cin=new Scanner(new BufferedInputStream (System.in) ); BigInteger a,b,c; int t,num=0; t=cin.nextInt(); while( t-->=1 ) {

链表或字符串模拟加法、加一及乘法

链表模拟加法/字符串模拟二进制加法/数组模拟加一操作/打印1到最大的n位数/字符串模拟乘法 ============================================ Add Two Numbers 两个链表代表两个数字,每个结点的值都是一位数字,单链表逆序存放这两个数字, 构造出一个新的链表,代表这两个链表的和. 链表的尾插法,头结点dummy结点的运用,统一对prev指针的操作, /** * Definition for singly-linked list. * struct