最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

大數(shù)(高精度數(shù))模板(分享)

 更新時間:2013年05月24日 16:51:05   作者:  
本篇文章對大數(shù)(高精度數(shù))模板進行了詳細的分析介紹,需要的朋友參考下
復制代碼 代碼如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h> 
#include <ctype.h>
#include <map>
#include <string>
#include <set>
#include <bitset>
#include <utility>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <iostream>
#include <fstream>
#include <list>
using  namespace  std;     

const  int MAXL = 500;     
struct  BigNum     
{     
    int  num[MAXL];     
    int  len;     
};     

//高精度比較 a > b return 1, a == b return 0; a < b return -1;     
int  Comp(BigNum &a, BigNum &b)     
{     
    int  i;     
    if(a.len != b.len) return (a.len > b.len) ? 1 : -1;     
    for(i = a.len-1; i >= 0; i--)     
        if(a.num[i] != b.num[i]) return  (a.num[i] > b.num[i]) ? 1 : -1;     
    return  0;     
}     

//高精度加法     
BigNum  Add(BigNum &a, BigNum &b)     
{     
    BigNum c;     
    int  i, len;     
    len = (a.len > b.len) ? a.len : b.len;     
    memset(c.num, 0, sizeof(c.num));     
    for(i = 0; i < len; i++)     
    {     
        c.num[i] += (a.num[i]+b.num[i]);     
        if(c.num[i] >= 10)     
        {     
            c.num[i+1]++;     
            c.num[i] -= 10;     
        }     
    }     
    if(c.num[len])
  len++;     
    c.len = len;     
    return  c;     
}     
//高精度減法,保證a >= b     
BigNum Sub(BigNum &a, BigNum &b)     
{     
    BigNum  c;     
    int  i, len;     
    len = (a.len > b.len) ? a.len : b.len;     
    memset(c.num, 0, sizeof(c.num));     
    for(i = 0; i < len; i++)     
    {     
        c.num[i] += (a.num[i]-b.num[i]);     
        if(c.num[i] < 0)     
        {     
            c.num[i] += 10;     
            c.num[i+1]--;     
        }     
    }     
    while(c.num[len] == 0 && len > 1)
  len--;     
    c.len = len;     
    return  c;     
}     
//高精度乘以低精度,當b很大時可能會發(fā)生溢出int范圍,具體情況具體分析     
//如果b很大可以考慮把b看成高精度     
BigNum Mul1(BigNum &a, int  &b)     
{     
    BigNum c;     
    int  i, len;     
    len = a.len;     
    memset(c.num, 0, sizeof(c.num));     
    //乘以0,直接返回0     
    if(b == 0)      
    {     
        c.len = 1;     
        return  c;     
    }     
    for(i = 0; i < len; i++)     
    {     
        c.num[i] += (a.num[i]*b);     
        if(c.num[i] >= 10)     
        {     
            c.num[i+1] = c.num[i]/10;     
            c.num[i] %= 10;     
        }     
    }     
    while(c.num[len] > 0)     
    {     
        c.num[len+1] = c.num[len]/10;     
        c.num[len++] %= 10;     
    }     
    c.len = len;      
    return  c;     
}     

//高精度乘以高精度,注意要及時進位,否則肯能會引起溢出,但這樣會增加算法的復雜度,     
//如果確定不會發(fā)生溢出, 可以將里面的while改成if     
BigNum  Mul2(BigNum &a, BigNum &b)     
{     
    int i, j, len = 0;     
    BigNum  c;     
    memset(c.num, 0, sizeof(c.num));     
    for(i = 0; i < a.len; i++)
 {
        for(j = 0; j < b.len; j++)     
        {     
            c.num[i+j] += (a.num[i]*b.num[j]);     
            if(c.num[i+j] >= 10)     
            {     
                c.num[i+j+1] += c.num[i+j]/10;     
                c.num[i+j] %= 10;     
            }     
        }
 }
    len = a.len+b.len-1;     
    while(c.num[len-1] == 0 && len > 1)
  len--;     
    if(c.num[len])
  len++;     
    c.len = len;     
    return  c;     
}     

//高精度除以低精度,除的結(jié)果為c, 余數(shù)為f     
void Div1(BigNum &a, int &b, BigNum &c, int &f)     
{     
    int  i, len = a.len;     
    memset(c.num, 0, sizeof(c.num));     
    f = 0;     
    for(i = a.len-1; i >= 0; i--)     
    {     
        f = f*10+a.num[i];     
        c.num[i] = f/b;     
        f %= b;     
    }     
    while(len > 1 && c.num[len-1] == 0)
  len--;     
    c.len = len;     
}     
//高精度*10     
void  Mul10(BigNum &a)     
{     
    int  i, len = a.len;     
    for(i = len; i >= 1; i--)     
        a.num[i] = a.num[i-1];     
    a.num[i] = 0;     
    len++;     
    //if a == 0     
    while(len > 1 && a.num[len-1] == 0)
  len--;     
}     

//高精度除以高精度,除的結(jié)果為c,余數(shù)為f     
void Div2(BigNum &a, BigNum &b, BigNum &c, BigNum &f)     
{     
    int  i, len = a.len;     
    memset(c.num, 0, sizeof(c.num));     
    memset(f.num, 0, sizeof(f.num));     
    f.len = 1;     
    for(i = len-1;i >= 0;i--)     
    {     
        Mul10(f);     
        //余數(shù)每次乘10     
        f.num[0] = a.num[i];     
        //然后余數(shù)加上下一位     
        ///利用減法替換除法     
        while(Comp(f, b) >= 0)     
        {
            f = Sub(f, b);     
            c.num[i]++;     
        }     
    }     
    while(len > 1 && c.num[len-1] == 0)
  len--;     
    c.len = len;     
}  
void  print(BigNum &a)   //輸出大數(shù)  
{     
    int  i;     
    for(i = a.len-1; i >= 0; i--)     
        printf("%d", a.num[i]);     
    puts("");     
}     
//將字符串轉(zhuǎn)為大數(shù)存在BigNum結(jié)構(gòu)體里面     
BigNum ToNum(char *s)     
{     
    int i, j;     
    BigNum  a;     
    a.len = strlen(s);     
    for(i = 0, j = a.len-1; s[i] != '\0'; i++, j--)     
        a.num[i] = s[j]-'0';     
    return  a;     
}     

void Init(BigNum &a, char *s, int &tag)   //將字符串轉(zhuǎn)化為大數(shù)
{  
    int  i = 0, j = strlen(s);
    if(s[0] == '-')
 {
  j--;
  i++;
  tag *= -1;
 }
    a.len = j;
    for(; s[i] != '\0'; i++, j--)
        a.num[j-1] = s[i]-'0';
}  

int main(void)     
{     
    BigNum a, b;  
    char  s1[100], s2[100];  
    while(scanf("%s %s", s1, s2) != EOF)  
    {  
        int tag = 1;  
        Init(a, s1, tag);    //將字符串轉(zhuǎn)化為大數(shù)
        Init(b, s2, tag);  
        a = Mul2(a, b);  
        if(a.len == 1 && a.num[0] == 0)  
        {  
            puts("0");  
        }  
        else   
        {  
            if(tag < 0) putchar('-');  
            print(a);  
        }  
    }  
    return 0;  
}

相關(guān)文章

  • Visual?Studio?2022?配置?PCL?1.12.1?的問題小結(jié)

    Visual?Studio?2022?配置?PCL?1.12.1?的問題小結(jié)

    這篇文章主要介紹了Visual?Studio?2022?配置?PCL?1.12.1?的經(jīng)驗總結(jié)分享,本文通過圖文實例相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • C語言實現(xiàn)可排序通訊錄的示例代碼

    C語言實現(xiàn)可排序通訊錄的示例代碼

    本文主要介紹了C語言實現(xiàn)可排序通訊錄的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • c語言詳解動態(tài)內(nèi)存分配及常見錯誤的解決

    c語言詳解動態(tài)內(nèi)存分配及常見錯誤的解決

    給數(shù)組分配多大的內(nèi)存空間?你是否和初學C時的我一樣,有過這樣的疑問。這一期就來聊一聊動態(tài)內(nèi)存的分配,讀完這篇文章,你可能對內(nèi)存的分配有一個更好的理解
    2022-04-04
  • C++ map詳解

    C++ map詳解

    下面小編就為大家?guī)硪黄獪\談c++中的map。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10
  • c語言讀取csv文件和c++讀取csv文件示例分享

    c語言讀取csv文件和c++讀取csv文件示例分享

    這篇文章主要介紹了c語言讀取csv文件和c++讀取csv文件示例,需要的朋友可以參考下
    2014-03-03
  • C++如何計算結(jié)構(gòu)體與對象的大小

    C++如何計算結(jié)構(gòu)體與對象的大小

    這篇文章主要給大家介紹了關(guān)于C++如何計算結(jié)構(gòu)體與對象大小的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • C/C++的堆棧內(nèi)存分配的實現(xiàn)

    C/C++的堆棧內(nèi)存分配的實現(xiàn)

    內(nèi)存管理是至關(guān)重要的一個方面,堆和棧是C語言中重要的內(nèi)存分配方式,本文主要介紹了C/C++的堆棧內(nèi)存分配的實現(xiàn),詳細的介紹了這兩者在管理方式、性能和使用場景,感興趣的可以了解一下
    2024-07-07
  • C++內(nèi)存管理之簡易內(nèi)存池的實現(xiàn)

    C++內(nèi)存管理之簡易內(nèi)存池的實現(xiàn)

    大家好,本篇文章主要講的是C++內(nèi)存管理之簡易內(nèi)存池的實現(xiàn),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2021-12-12
  • OpenCV實現(xiàn)圖像校正功能

    OpenCV實現(xiàn)圖像校正功能

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像校正功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 《C++ primer plus》讀書筆記(一)

    《C++ primer plus》讀書筆記(一)

    本讀書筆記是C++ primer plus(第六版)前3章的學習筆記。非常的淺顯易懂,復習C++基礎(chǔ)知識的可以瞄瞄。
    2014-10-10

最新評論

贞丰县| 若尔盖县| 广德县| 海阳市| 临夏市| 夹江县| 万州区| 新津县| 武鸣县| 石家庄市| 汾西县| 五寨县| 鄱阳县| 灌南县| 蓬安县| 湖北省| 新巴尔虎右旗| 芜湖市| 自治县| 文昌市| 嘉黎县| 葵青区| 安吉县| 微博| 宝鸡市| 赤壁市| 平果县| 桐梓县| 井冈山市| 天镇县| 绥江县| 永嘉县| 宜川县| 祁东县| 南乐县| 和静县| 个旧市| 宁城县| 湘潭县| 工布江达县| 兰西县|