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

/*
  Name: 高精度整數(shù)運算改進版
  Copyright:始發(fā)于goal00001111的專欄;允許自由轉載,但必須注明作者和出處
  Author: goal00001111
  Date: 15-12-08 08:18
  Description:
高精度整數(shù)運算:加減乘除,乘方,階乘 。
上次寫了一個用字符串存儲高精度整數(shù)的四則運算算法,雖然可以實現(xiàn)功能,但時間復雜度和空間復雜度都不夠理想,
這次出了個改進版,將原來的用字符串存儲改成用整型數(shù)組存儲,而且改進了乘法,除法和乘方的算法,更快更高效!
*/
#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ù)組的實際長度
} 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ù)字的字符串轉換為用整型數(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)
{
    //逆序計算a+b,則從低位開始計算
    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)//交換,并得到一個負號
    {
        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)//如果是負數(shù),加上負號
        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)//最高位有進位
            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的低位補足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ù)功能:二分法實現(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 夢想飛揚 閱讀(2111) 評論(2)  編輯 收藏 引用

Feedback

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

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

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

2008-12-25 01:22 by 本拉瘸
用vs2008編譯運行馬上堆棧溢出.
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产一区二区三区高清| 亚洲日本成人| 午夜精品在线| 亚洲一区二区动漫| 99精品国产热久久91蜜凸| 国产精品日韩久久久| 国产精品www网站| 美女精品自拍一二三四| 蜜臀av一级做a爰片久久| 免费成人黄色av| 欧美日韩在线影院| 国产精品毛片大码女人| 国产精品热久久久久夜色精品三区 | 麻豆久久婷婷| 免费成人黄色| 欧美日韩在线综合| 国产一区在线观看视频| 亚洲欧洲偷拍精品| 亚洲午夜精品久久久久久浪潮| 亚洲一区二区成人| 久久亚洲综合色一区二区三区| 亚洲大胆女人| 亚洲视频一区在线观看| 久久国产精品高清| 欧美精品久久久久久久久老牛影院| 欧美性大战久久久久久久蜜臀| 国产日韩在线不卡| 99热这里只有精品8| 久久久久九九九| 亚洲毛片一区二区| 久久久天天操| 国产精品久久久一区二区三区| 国模叶桐国产精品一区| 一区二区三区精品视频| 久久夜色精品一区| 亚洲色在线视频| 欧美sm视频| 欧美精品一区在线| 国语自产精品视频在线看抢先版结局 | 欧美一级欧美一级在线播放| 毛片一区二区三区| 国产美女精品| 一区二区高清在线| 欧美风情在线| 久久国产色av| 国产一区二区三区黄| 一区二区三区国产精华| 美女诱惑黄网站一区| 亚洲专区国产精品| 欧美日韩在线高清| 亚洲毛片在线观看| 欧美激情第9页| 久久精品视频一| 国产欧美丝祙| 欧美一级久久久| 99成人在线| 亚洲人久久久| 免费中文日韩| 久久久亚洲一区| 国产最新精品精品你懂的| 欧美一级黄色录像| 亚洲性xxxx| 国产精品一二三| 欧美一区二区福利在线| 亚洲在线网站| 国产美女诱惑一区二区| 欧美一级视频精品观看| 亚洲一区二区高清视频| 国产精品狼人久久影院观看方式| 亚洲神马久久| 亚洲一区黄色| 国产综合第一页| 欧美ed2k| 欧美人与性动交a欧美精品| 亚洲免费不卡| 亚洲视频一二| 国产原创一区二区| 裸体素人女欧美日韩| 女人色偷偷aa久久天堂| 日韩视频在线免费| 99国产成+人+综合+亚洲欧美| 欧美日韩亚洲视频| 性欧美精品高清| 久久精品国产91精品亚洲| 在线免费观看日本欧美| 亚洲人成网站影音先锋播放| 欧美精品免费视频| 亚洲欧美制服另类日韩| 久久精品男女| 一区二区三区精品在线| 欧美影院在线播放| 日韩午夜视频在线观看| 亚洲欧美国产毛片在线| 激情久久久久久| 99国产精品久久久久久久久久 | 99亚洲一区二区| 亚洲欧美另类在线| 亚洲狠狠丁香婷婷综合久久久| 亚洲精品一区二区三区在线观看| 国产精品欧美日韩一区| 欧美国产日韩在线| 欧美午夜激情视频| 欧美黄色免费网站| 国产目拍亚洲精品99久久精品| 欧美成人综合网站| 国产精品亚洲一区二区三区在线| 玖玖在线精品| 国产精品一区二区久久久| 亚洲国产经典视频| 国产专区精品视频| 亚洲图片你懂的| 99国内精品| 久久野战av| 久久久久在线观看| 国产精品毛片在线看| 欧美黑人国产人伦爽爽爽| 亚洲片国产一区一级在线观看| 欧美高清视频| 久久最新视频| 国产欧美一区二区三区国产幕精品 | 狠狠久久婷婷| 亚洲九九精品| 91久久久久久| 久久久噜噜噜久久久| 欧美在线视频在线播放完整版免费观看 | 国产精品99久久久久久人| 亚洲日本中文字幕免费在线不卡| 欧美一区二区视频在线| 欧美一区成人| 国产精品午夜春色av| 亚洲视频你懂的| 亚洲欧美成人网| 欧美先锋影音| 亚洲一级二级| 欧美一区在线视频| 国产欧美一区二区视频| 午夜天堂精品久久久久| 久久精品在线视频| 一区在线电影| 嫩草国产精品入口| 亚洲国产成人在线视频| 亚洲精品一区二区三区蜜桃久| 另类激情亚洲| 亚洲人成网站999久久久综合| 日韩视频免费观看| 欧美手机在线| 亚洲欧美国产毛片在线| 久久av一区| 伊人色综合久久天天| 久久久久99| 亚洲丁香婷深爱综合| 麻豆91精品91久久久的内涵| 久久婷婷成人综合色| 亚洲人永久免费| 欧美成年人视频| 亚洲高清在线视频| 亚洲欧洲日韩综合二区| 欧美日韩视频第一区| 日韩视频在线一区二区| 一区二区三区国产| 久久成人这里只有精品| 欧美韩国在线| 91久久精品国产91性色tv| 欧美成人激情视频| 另类图片国产| 在线视频亚洲| 国产精品久久九九| 亚洲一级免费视频| 久久国产精品99国产| 国内精品美女在线观看| 久久九九免费视频| 欧美波霸影院| 亚洲精品日韩精品| 国产在线欧美| 久久亚洲私人国产精品va| 久久精品国产免费| 麻豆精品一区二区综合av| 日韩系列在线| 国产精品成人久久久久| 亚洲一卡久久| 久久亚洲电影| 亚洲一区二区在线看| 国产精品入口夜色视频大尺度| 亚洲欧美国产精品专区久久| 亚洲第一成人在线| 久久精品人人做人人综合 | 欧美日韩一区二区在线视频| 欧美呦呦网站| 亚洲一区视频在线| 亚洲区一区二区三区| 免费黄网站欧美| 欧美一区影院| 午夜精品久久久久久久蜜桃app| 亚洲欧洲视频在线| 亚洲成人中文| 狠狠色噜噜狠狠色综合久| 国产精品视频1区| 国产精品成人v| 欧美日韩国产综合在线| 欧美a级大片|