青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

/*
  Name: 高精度整數(shù)運(yùn)算改進(jìn)版
  Copyright:始發(fā)于goal00001111的專欄;允許自由轉(zhuǎn)載,但必須注明作者和出處
  Author: goal00001111
  Date: 15-12-08 08:18
  Description:
高精度整數(shù)運(yùn)算:加減乘除,乘方,階乘 。
上次寫了一個用字符串存儲高精度整數(shù)的四則運(yùn)算算法,雖然可以實(shí)現(xiàn)功能,但時間復(fù)雜度和空間復(fù)雜度都不夠理想,
這次出了個改進(jìn)版,將原來的用字符串存儲改成用整型數(shù)組存儲,而且改進(jìn)了乘法,除法和乘方的算法,更快更高效!
*/
#include<iostream>
#include<string>

using namespace std;

const unsigned int MAX = 10000; //整型數(shù)組的最大長度
const long long WIDTHMAX = 1000000000; //整型數(shù)組val[MAX]的元素上限
const unsigned int WIDTH = 9;  //輸出整型數(shù)組val[MAX]的元素時的格式寬度,即整型數(shù)組val[MAX]的元素的最多位數(shù)

typedef struct node
{
    long long val[MAX]; //用來存儲高精度整數(shù)
    unsigned int size; //整型數(shù)組的實(shí)際長度
} BigInt;

BigInt StrToBigInt(string s);
void PrintBigInt(const BigInt & a);
int ComPareBigInt(const BigInt & a, const BigInt & b);
BigInt MulBigInt(const BigInt & a, const BigInt & b);
BigInt AddBigInt(const BigInt & a, const BigInt & b);
BigInt SubBigInt(BigInt a, BigInt b);
BigInt DivBigInt(const BigInt & a, const BigInt & b);
BigInt FacBigInt(unsigned int n);
void PowBigInt(BigInt & c, const BigInt & a, unsigned int n);
void PowBigInt_2(BigInt & c, const BigInt & a, unsigned int n);
BigInt HalfBigInt(BigInt a);

int main()
{
    string s;
    BigInt a, b, c;
   
    cin >> s;
    a = StrToBigInt(s);
    cin >> s;
    b = StrToBigInt(s);
   
    cout << "  ";
    PrintBigInt(a);
    cout << "+ ";
    PrintBigInt(b);
    c = AddBigInt(a, b);
    cout << "= ";
    PrintBigInt(c);
    cout << endl;
   
    cout << "  ";
    PrintBigInt(a);
    cout << "- ";
    PrintBigInt(b);
    c = SubBigInt(a, b);
    cout << "= ";
    PrintBigInt(c);
    cout << endl;
   
    cout << "  ";
    PrintBigInt(a);
    cout << "* ";
    PrintBigInt(b);
    c = MulBigInt(a, b);
    cout << "= ";
    PrintBigInt(c);
    cout << endl;
   
    cout << "  ";
    PrintBigInt(a);
    cout << "/ 2 " << endl;
    c = HalfBigInt(a);
    cout << "= ";
    PrintBigInt(c);
    cout << endl;
   
    cout << "  ";
    PrintBigInt(a);
    cout << "/ ";
    PrintBigInt(b);
    c = DivBigInt(a, b);
    cout << "= ";
    PrintBigInt(c);
    cout << endl;
   
    unsigned int n;
    cin >> n;
    //cout << n << "! = ";
//    c = FacBigInt(n);
//    PrintBigInt(c);
//    cout << c.size << endl;
     cout << endl;

    cout << "  ";
    PrintBigInt(a);
    cout << "^" << n << " = ";
    PowBigInt(c, a, n);
    PrintBigInt(c);
    cout << endl;
   
    cout << "  ";
    PrintBigInt(a);
    cout << "^" << n << " = ";
    PowBigInt_2(c, a, n);
    PrintBigInt(c);
    cout << endl;
   
    system("pause");
    return 0;
}
/*
函數(shù)名稱:PrintBigInt
函數(shù)功能:輸出用整型數(shù)組表示的高精度整數(shù)
輸入?yún)?shù):const BigInt & a:用整型數(shù)組表示的高精度整數(shù)
輸出參數(shù):無
*/
void PrintBigInt(const BigInt & a)
{
    cout << a.val[a.size-1];
    for (int i=a.size-2; i>=0; i--)
    {
        unsigned w = WIDTHMAX / 10;
        while (w > 0)
        {
            if (a.val[i] >= w)
                break;
            cout << 0;
            w /= 10;
        }
        cout << a.val[i];
    }
    cout << endl;
}
/*
函數(shù)名稱:StrToBigInt
函數(shù)功能:把元素為數(shù)字的字符串轉(zhuǎn)換為用整型數(shù)組表示的高精度整數(shù)
輸入?yún)?shù):string s:存儲數(shù)字的字符串
輸出參數(shù):BigInt:返回用整型數(shù)組表示的高精度整數(shù)
*/
BigInt StrToBigInt(string s)
{
    BigInt a;
    a.size = 0;
    int i = s.size();
    unsigned long long sum = 0;
    while ( i>=WIDTH)
    {
        for (int j=i-WIDTH; j<i; j++)
            sum = sum * 10 + (s[j] - '0');
        a.val[a.size++] = sum;
        sum = 0;
        i -= WIDTH;
    }
    if (i > 0)
    {
        for (int j=0; j<i; j++)
            sum = sum * 10 + (s[j] - '0');
        a.val[a.size++] = sum;
    }
    return a;
}
/*
函數(shù)名稱:AddBigInt
函數(shù)功能:高精度整數(shù)加法
輸入?yún)?shù):const BigInt & a:用整型數(shù)組表示的高精度整數(shù)加數(shù)
          const BigInt & b:用整型數(shù)組表示的高精度整數(shù)加數(shù)
輸出參數(shù):BigInt:返回用整型數(shù)組表示的高精度整數(shù)和
*/
BigInt AddBigInt(const BigInt & a, const BigInt & b)
{
    //逆序計(jì)算a+b,則從低位開始計(jì)算
    BigInt c;
    unsigned long long carry = 0;
    unsigned int i = 0;
    c.size = 0;
    while (i < a.size && i < b.size)
    {
        c.val[c.size++] = (a.val[i] + b.val[i] + carry) % WIDTHMAX;
        carry = (a.val[i] + b.val[i] + carry) / WIDTHMAX;
        i++;
    }
    while (i < a.size)
    {
        c.val[c.size++] =  (a.val[i] + carry) % WIDTHMAX;
        carry = (a.val[i] + carry) / WIDTHMAX;
        i++;
    }
    while (i < b.size)
    {
        c.val[c.size++] =  (b.val[i] + carry) % WIDTHMAX;
        carry = (b.val[i] + carry) / WIDTHMAX;
        i++;
    }
    if (carry > 0)
        c.val[c.size++] = carry;
    return c;
}
/*
函數(shù)名稱:SubBigInt
函數(shù)功能:高精度整數(shù)減法
輸入?yún)?shù):BigInt a:用整型數(shù)組表示的高精度整數(shù)被減數(shù)
          BigInt b:用整型數(shù)組表示的高精度整數(shù)減數(shù)
輸出參數(shù):BigInt:返回用整型數(shù)組表示的高精度整數(shù)差
*/
BigInt SubBigInt(BigInt a, BigInt b)
{
    BigInt c;
    c.size = 0;
    if (ComPareBigInt(a, b) == 0)
    {
        c.size = 1;
        c.val[0] = 0;
        return c;
    }
    bool flag = false;
    if (ComPareBigInt(a, b) < 0)//交換,并得到一個負(fù)號
    {
        flag = true;
        BigInt temp = a;
        a = b;
        b = temp;
    }
    unsigned int i = 0;
    while (i < b.size)
    {
        if (a.val[i] >= b.val[i])
             c.val[c.size++] = a.val[i] - b.val[i];
        else
        {
            a.val[i+1] -= 1;
            c.val[c.size++] = a.val[i] + WIDTHMAX - b.val[i];
        }  
        i++;
    }
    while (i < a.size)
    {
        if (a.val[i] < 0)
        {
            a.val[i+1] -= 1;
            a.val[i] += WIDTHMAX;
        }
        c.val[c.size++] = a.val[i];
        i++;
    }
    //消除多余的高位0
    while (c.val[c.size-1] == 0)
        c.size--;
          
    if (flag)//如果是負(fù)數(shù),加上負(fù)號
        c.val[c.size-1] = -c.val[c.size-1];
    return c;
}
/*
函數(shù)名稱:ComPareBigInt
函數(shù)功能:比較兩個高精度整數(shù)的大小
輸入?yún)?shù):BigInt a:用整型數(shù)組表示的高精度整數(shù)被減數(shù)
          BigInt b:用整型數(shù)組表示的高精度整數(shù)減數(shù)
輸出參數(shù):int:a > b返回1,a = b返回0,a < b返回-1
*/
int ComPareBigInt(const BigInt & a, const BigInt & b)
{
    if (a.size > b.size)
        return 1;
    if (a.size < b.size)
        return -1;
       
    for (int i=a.size-1; i>=0; i--)
    {
        if (a.val[i] > b.val[i])
            return 1;
        if (a.val[i] < b.val[i])
            return -1;
    }
    return 0;
}
/*
函數(shù)名稱:MulBigInt
函數(shù)功能:高精度整數(shù)乘法
輸入?yún)?shù):const BigInt & a:用整型數(shù)組表示的高精度整數(shù)被乘數(shù)
          const BigInt & b:用整型數(shù)組表示的高精度整數(shù)乘數(shù)
輸出參數(shù):BigInt:返回用整型數(shù)組表示的高精度整數(shù)乘積
*/
BigInt MulBigInt(const BigInt & a, const BigInt & b)
{
    if (a.size == 1 && a.val[0] == 0)
        return a;
    if (b.size == 1 && b.val[0] == 0)
        return b;
 
    BigInt c;
    for (int i=0; i<MAX; i++) //全部賦初值為0
        c.val[i] = 0;
    for (int i=0, j=0; i<b.size; i++)
    {
        for (j=0; j<a.size; j++)
        {
            c.val[i+j] += a.val[j] * b.val[i];
            c.val[i+j+1] += c.val[i+j] / WIDTHMAX;
            c.val[i+j] %= WIDTHMAX;
        }
        c.size = i + j;
        if (c.val[c.size] != 0)//最高位有進(jìn)位
            c.size++;
    }
    return c;
}
/*
老版本:
BigInt MulBigInt2(const BigInt & a, const BigInt & b)
{
    if (a.size == 1 && a.val[0] == 0)
        return a;
    if (b.size == 1 && b.val[0] == 0)
        return b;
 
    BigInt c, tc;
    unsigned long long carry = 0;
    c.size = 0;
    for (int i=0, j=0; i<b.size; i++)
    {
        for (j=0; j<i; j++)//先在臨時和tc的低位補(bǔ)足0
            tc.val[j] = 0;
        carry = 0;
        for (j=0; j<a.size; j++)
        {
            tc.val[i+j] = (a.val[j] * b.val[i] + carry) % WIDTHMAX;
            carry = (a.val[j] * b.val[i] + carry) / WIDTHMAX;
        }
        tc.size = i + j;
        if (carry > 0)
            tc.val[tc.size++] = carry;
        //累加到c中
        c = AddBigInt(tc, c);
    }
    return c;
}
*/

/*
函數(shù)名稱:FacBigInt
函數(shù)功能:高精度整數(shù)階乘
輸入?yún)?shù):unsigned int n:正整數(shù)
輸出參數(shù):BigInt:返回用整型數(shù)組表示的高精度整數(shù)階乘
*/
BigInt FacBigInt(unsigned int n)
{
    BigInt s, c;
    c.size = s.size = 1;
    s.val[0] = 1;
    for (unsigned long long i=2; i<=n; i++)
    {
        c.val[0] = i;
        s = MulBigInt(s, c);
    }
    return s;
}

/*
函數(shù)名稱:PowBigInt
函數(shù)功能:遞歸高效算法求高精度整數(shù)冪
輸入?yún)?shù):BigInt & c:存儲高精度整數(shù)冪的整型數(shù)組
          const BigInt & a:用整型數(shù)組表示的高精度整數(shù)底數(shù)
          long long n:  指數(shù)
*/
void PowBigInt(BigInt & c, const BigInt & a, unsigned int n)
{
    if (n == 1)
    {
        c = a;
        return ;
    }
    if (n == 0 || (a.size == 1 && a.val[0] == 1))
    {
        c.size = c.val[0] = 1;
        return ; 
    }
   
    PowBigInt(c, a, n/2); //遞歸求高精度整數(shù)冪
   
    c = MulBigInt(c, c); //a^n = a^(n/2)*a^(n/2)*f(a)
    if (n % 2 == 1)      //其中f(a) = 1(n%2==0)或f(a) = a(n%2==1)
        c = MulBigInt(a, c);
}

/*
函數(shù)名稱:PowBigInt_2
函數(shù)功能:非遞歸高效算法求高精度整數(shù)冪
輸入?yún)?shù):BigInt & c:存儲高精度整數(shù)冪的整型數(shù)組
          const BigInt & a:用整型數(shù)組表示的高精度整數(shù)底數(shù)
          long long n:  指數(shù)
*/
void PowBigInt_2(BigInt & c, const BigInt & a, unsigned int n)
{
    int stack[MAX] = {0};
    int top = 0;
    while (n > 0) //利用一個棧來存儲n的狀態(tài):奇數(shù)還是偶數(shù)
    {
        stack[top++] = n % 2;
        n /= 2;
    }
    c.size = c.val[0] = 1;
    for (int i=top-1; i>=0; i--)
    {
        c = MulBigInt(c, c);  //a^n = a^(n/2)*a^(n/2)*f(a)
        if (stack[i] == 1)   //其中f(a) = 1(n%2==0)或f(a) = a(n%2==1)
            c = MulBigInt(a, c);
    }
}

/*
函數(shù)名稱:DivBigInt
函數(shù)功能:二分法實(shí)現(xiàn)高精度整數(shù)除法
輸入?yún)?shù):const BigInt & a:用整型數(shù)組表示的高精度整數(shù)被除數(shù)
          const BigInt & b:用整型數(shù)組表示的高精度整數(shù)除數(shù)
輸出參數(shù):BigInt:返回用整型數(shù)組表示的高精度整數(shù)商
*/
BigInt DivBigInt(const BigInt & a, const BigInt & b)
{
    BigInt high, low, mid, one, c;
    if ((a.size == 1 && a.val[0] == 0) || (b.size == 1 && b.val[0] == 0))
    {
        c.size = 1;
        c.val[0] = 0;
        return c;
    }
   
    one.size = 1; //值為1的高精度整數(shù)
    one.val[0] = 1;
    high = a;  //上界
    low.size = 1; //下界
    low.val[0] = 0;
    while (ComPareBigInt(low, high) < 0)
    {
        mid = HalfBigInt(AddBigInt(high, low)); //中間數(shù)
        c = MulBigInt(mid, b);
        if (ComPareBigInt(c, a) == 0)
            return mid;
        else if (ComPareBigInt(c, a) < 0)
            low = AddBigInt(mid, one);
        else
            high = SubBigInt(mid, one);
    }     
    c = MulBigInt(low, b);
    if (ComPareBigInt(c, a) <= 0)
        return low;
    else
        return SubBigInt(low, one);
}

/*
函數(shù)名稱:HalfBigInt
函數(shù)功能:高精度整數(shù)求半
輸入?yún)?shù):BigInt a:用整型數(shù)組表示的高精度整數(shù)
輸出參數(shù):BigInt:返回用整型數(shù)組表示的高精度整數(shù)的一半
*/
BigInt HalfBigInt(BigInt a)
{
    BigInt c;
    c.size = a.size;
    for (int i=a.size-1; i>0; i--)
    {
        c.val[i] = a.val[i] / 2;  
        if (a.val[i] % 2 == 1)
            a.val[i-1] += WIDTHMAX;
    }
    c.val[0] = a.val[0] / 2;  
    if (c.size > 0 && c.val[c.size-1] == 0)
        c.size--;
       
    return c;
}


Posted on 2008-12-15 17:41 夢想飛揚(yáng) 閱讀(2111) 評論(2)  編輯 收藏 引用

Feedback

# re: 高精度整數(shù)運(yùn)算改進(jìn)版  回復(fù)  更多評論   

2008-12-15 19:06 by 無名
我記得高精度乘法的高效率實(shí)現(xiàn)是使用FFT卷積什么的,你可以改進(jìn)一下

# re: 高精度整數(shù)運(yùn)算改進(jìn)版  回復(fù)  更多評論   

2008-12-25 01:22 by 本拉瘸
用vs2008編譯運(yùn)行馬上堆棧溢出.

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美高清在线| 国产日韩一级二级三级| 亚洲图片激情小说| 一区二区三区日韩| 这里只有精品视频| 一二三区精品| 欧美一区二区三区四区视频| 欧美综合激情网| 欧美福利一区| 国产精品v亚洲精品v日韩精品 | 狠狠色综合播放一区二区| 国产精品免费视频xxxx| 国内精品国产成人| 亚洲乱码国产乱码精品精| 一区二区三区精密机械公司 | 中国女人久久久| 欧美在线亚洲综合一区| 欧美黑人在线观看| 亚洲欧美视频在线| 欧美成人精品| 亚洲激情第一区| 久久色在线播放| 亚洲视频在线观看视频| 裸体歌舞表演一区二区| 国产人久久人人人人爽| 久久国产日韩欧美| 国产精品入口日韩视频大尺度| 狠狠色狠狠色综合日日小说| 亚洲一二三级电影| 欧美xart系列在线观看| 欧美影片第一页| 国产一区二区三区四区老人| 欧美亚洲一级| 欧美一二三区精品| 国产一区二区三区在线播放免费观看| 99这里只有精品| 夜夜嗨av一区二区三区中文字幕| 欧美成人情趣视频| 日韩亚洲精品电影| 一区二区欧美激情| 国产欧美日韩伦理| 久久婷婷一区| 欧美精品在线一区| 一本一本久久a久久精品牛牛影视| 欧美成年人网| 欧美日韩第一区| 欧美在线电影| 久久免费国产精品| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲国产高清高潮精品美女| 久久综合色一综合色88| 亚洲精品美女久久7777777| 亚洲一区二区三区免费在线观看| 国产专区一区| 亚洲网站在线| 一本大道久久a久久综合婷婷| 亚洲香蕉成视频在线观看| 午夜精品999| 亚洲夜间福利| 欧美精品乱人伦久久久久久| 欧美一区二区三区免费大片| 欧美国产精品久久| 欧美不卡福利| 亚洲国产精彩中文乱码av在线播放| avtt综合网| 亚洲图片你懂的| 欧美视频专区一二在线观看| 亚洲国产精品成人综合| 亚洲区免费影片| 美脚丝袜一区二区三区在线观看| 久久久久se| 精品1区2区3区4区| 亚洲精品日韩综合观看成人91| 在线不卡中文字幕| 狼人天天伊人久久| 亚洲国产精品999| 亚洲美女在线看| 亚洲综合国产精品| 国产主播精品| 久久综合色一综合色88| 欧美成人午夜剧场免费观看| 亚洲欧洲日产国码二区| 欧美日韩在线播| 欧美一区二区在线免费观看| 欧美福利网址| 欧美在线免费| 亚洲毛片一区二区| 国产亚洲亚洲| 欧美日韩大片| 久久久噜噜噜久噜久久| 亚洲精品日韩欧美| 久久亚洲私人国产精品va媚药| 亚洲片国产一区一级在线观看| 欧美国产日本韩| 久久久91精品国产一区二区精品| 好吊视频一区二区三区四区| 欧美电影打屁股sp| 久久久精品国产免费观看同学| 亚洲精品视频在线看| 亚洲第一精品影视| 久久夜色撩人精品| 欧美一区二区高清| 欧美一级视频精品观看| 在线一区二区日韩| 日韩一区二区免费高清| 亚洲国产精品成人综合色在线婷婷| 国产午夜一区二区三区| 国产精品免费观看在线| 欧美特黄a级高清免费大片a级| 欧美**人妖| 欧美三级韩国三级日本三斤| 欧美极品在线视频| 欧美日韩国产高清| 国产精品视频九色porn| 国产精品视频99| 欧美视频在线一区| 国产欧美大片| 亚洲高清视频中文字幕| 亚洲人成网站在线播| aa级大片欧美| 久久国产精品99国产| 免费久久99精品国产| 亚洲国产综合91精品麻豆| 日韩视频二区| 久久精品国产亚洲精品| 欧美成人dvd在线视频| 欧美激情视频一区二区三区在线播放 | 久久精品99久久香蕉国产色戒| 国产精品久久久久999| 国产综合色精品一区二区三区| 国产亚洲精品7777| 欧美国产91| 日韩亚洲欧美一区二区三区| 久久久www成人免费精品| 亚洲精选国产| 欧美二区在线看| 欧美中文日韩| 亚洲黄色影片| 久久乐国产精品| 亚洲黄一区二区| 免费观看在线综合| 一区二区三区高清在线| 99精品视频免费全部在线| 国产精品一二三四| 亚洲在线视频网站| 亚洲国产cao| 欧美福利视频一区| 欧美成人小视频| 亚洲国产成人在线| 欧美一区二区三区男人的天堂 | 亚洲作爱视频| 亚洲国产精品va在线看黑人动漫| 香蕉免费一区二区三区在线观看| 欧美极品色图| 午夜久久福利| aa级大片欧美三级| 国产精品三级视频| 久久精品国产99国产精品| 亚洲欧美中文在线视频| 国产日韩欧美日韩大片| 一区在线免费| 亚洲国产人成综合网站| 欧美精品18videos性欧美| 一本大道久久a久久精二百| 亚洲欧洲综合另类在线| 欧美日韩亚洲一区| 久久在线免费观看| 欧美国产精品| 亚洲一区二区综合| 国产精品久久久久免费a∨大胸| 亚洲欧美日韩精品久久奇米色影视 | 久久精品91| 欧美日韩国语| 久久成人亚洲| 欧美日韩国产区| 欧美激情免费观看| 好吊妞**欧美| 亚洲欧美另类在线| 亚洲视频电影在线| 久久综合久久综合这里只有精品| 精品福利免费观看| 亚洲免费视频在线观看| 这里只有精品视频| 欧美日韩 国产精品| 亚洲精品影院| 亚洲国产另类久久久精品极度| 最新成人av网站| 亚洲欧洲精品天堂一级| 亚洲午夜女主播在线直播| 亚洲免费激情| 欧美日韩精品免费观看视一区二区 | 久久国产一区| 卡一卡二国产精品| 国产美女精品一区二区三区| 99成人在线| 亚洲国产另类久久精品| 蜜乳av另类精品一区二区| 欧美好吊妞视频| 夜夜精品视频一区二区| 欧美理论在线播放|