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

/*
  Name: 高精度運(yùn)算
  Copyright:始發(fā)于goal00001111的專欄;允許自由轉(zhuǎn)載,但必須注明作者和出處
  Author: goal00001111
  Date: 01-12-08 15:04
  Description:
高精度運(yùn)算:加減乘除,乘方,階乘
*/

#include<iostream>
#include<string>

using namespace std;

void Reverse(string & str);
void AddInt(string & c, string a, string b);
void SubInt(string & c, string a, string b);
void MulInt(string & c, string a, string b);
void JieCHInt(string & c, string b);
void DivInt(string & c, string a, string b);
void PowInt(string & c, string a, string b);

int main()
{
    string a, b, c;
    cin >> a >> b;
   
    AddInt(c, a, b);
    cout << a << " + ";
    cout << b << " = " << endl;
    cout << c << endl;
   
    SubInt(c, a, b);
    cout << a << " - ";
    cout << b << " = " << endl;
    cout << c << endl;

    MulInt(c, a, b);
    cout << a << " * ";
    cout << b << " = " << endl;
    cout << c << endl;

//   
//    cin >> b;
//    JieCHInt(c, b);
//    cout << b << " ! = " << endl;
//    cout << c << endl;
//   
    DivInt(c, a, b);
    cout << a << " / ";
    cout << b << " = " << endl;
    cout << c << endl;
   
//    PowInt(c, a, b);
//    cout << a << " ^ ";
//    cout << b << " = " << endl;
//    cout << c << endl;
   
    system("pause");
    return 0;
}

void Reverse(string & str)
{
    int left, right;
    left = 0; right = str.size()-1;
    while (left < right)
    {
        char ch = str[left];
        str[left] = str[right];
        str[right] = ch;
        left++; right--;
    }
}

void AddInt(string & c, string a, string b)//模仿遞增向量的合并方法
{
    c.resize(0);
    Reverse(a);
    Reverse(b);
   
    //逆序計(jì)算a+b,則從低位開(kāi)始計(jì)算
    int i, carry;
    i = carry = 0;
    while (i < a.size() && i < b.size())
    {
        c    += (a[i]-'0' + b[i]-'0' + carry) % 10 + '0';
        carry = (a[i]-'0' + b[i]-'0' + carry) / 10;
        i++;
    }
    while (i < a.size())
    {
        c    += (a[i]-'0' + carry) % 10 + '0';
        carry = (a[i]-'0' + carry) / 10;
        i++;
    }
    while (i < b.size())
    {
        c    += (b[i]-'0' + carry) % 10 + '0';
        carry = (b[i]-'0' + carry) / 10;
        i++;
    }
    while (carry > 0)//計(jì)算進(jìn)位部分
    {
        c     += carry % 10 + '0';
        carry /= 10;
    }
    i = c.size() - 1;
    while (c[i] == '0')//消除多余的高位0
    {
        i--;
    }
    c = c.substr(0, i+1);
    Reverse(c);
}

void SubInt(string & c, string a, string b)//模仿遞增向量的合并方法
{
    c.resize(0);
   
    if (a == b)
    {
        c += '0';
        return ;
    }
   
    bool flag = false;
    if (a.size() < b.size() || (a.size() == b.size() && a < b))//交換,并得到一個(gè)負(fù)號(hào)
    {
        flag = true;
        string temp = a;
        a = b;
        b = temp;
    }
   
    Reverse(a);
    Reverse(b); ;
    int i = 0;
    while (i < b.size())
    {
        if (a[i] >= b[i])
             c += a[i] - b[i] + '0';
        else
        {
            a[i+1] -= 1;
            c      += a[i] + 10 - b[i] + '0';
        }  
        i++;
    }
    while (i < a.size())
    {
        if (a[i] < '0')
        {
            a[i+1] -= 1;
            a[i] += 10;
        }
        c += a[i];
        i++;
    }
    i = c.size() - 1;
    while (c[i] == '0')//消除多余的高位0
    {
        i--;
    }
    c = c.substr(0, i+1);
    if (flag)
        c += '-';
    Reverse(c);
}

void MulInt(string & c, string a, string b)
{
    c.resize(0);
    if (a == "0" || b == "0")
    {
        c += '0';
        return ;
    }
   
    Reverse(a);
    Reverse(b);
    string ta, tb, tc;
    int carry = 0;
    for (int i=0; i<b.size(); i++)
    {
        tc.resize(0);
        for (int j=0; j<i; j++)//先在臨時(shí)和tc的低位補(bǔ)足0
            tc += '0';
       
        carry = 0;
        for (int j=0; j<a.size(); j++)
        {
            tc   += ((a[j]-'0') * (b[i]-'0') + carry) % 10 + '0';
            carry = ((a[j]-'0') * (b[i]-'0') + carry) / 10;
        }
        while (carry > 0)//計(jì)算進(jìn)位部分
        {
            tc    += carry % 10 + '0';
            carry /= 10;
        }
        //累加到c中
        ta = c;
        Reverse(ta);
        Reverse(tc);
        AddInt(c, ta, tc);
        Reverse(c);
        //消除多余的高位0
        int pos = c.size() - 1;
        while (c[pos] == '0')
        {
            pos--;
        }
        c = c.substr(0, pos+1);
    }
   
    Reverse(c);
}

void JieCHInt(string & c, string b)
{
    string tb = "2";
    c = "1";
    while (tb.size() < b.size() || (tb.size() == b.size() && tb <= b))
    {
        MulInt(c, c, tb);
        AddInt(tb, tb, "1");
    }
}

void DivInt(string & c, string a, string b)
{
    c.resize(0);
    if (a == "0" || b == "0")
    {
        c += '0';
        return ;
    }
   
    string copyA = a;//存儲(chǔ)a的值,之后a的值會(huì)變化
    while (a == b || a.size() > b.size() || (a.size() == b.size() && a > b))//直到余數(shù)小于除數(shù)
    {
        for (int n=1; n<=a.size(); n++)
        {
            string ta = a.substr(0, n);//提取不小于除數(shù)的部分被除數(shù)
            if (ta == "0") //是0直接跳過(guò)
            {
                c += '0';
                a = a.substr(n, a.size()-n);
                break;
            }
            if (ta == b)//相等,商為1,被除數(shù)去掉前n位
            {
                c += '1';
                a = a.substr(n, a.size()-n);
                break;
            }
            else if (ta.size() > b.size() || (ta.size() == b.size() && ta > b))//被除數(shù)不小于除數(shù)
            {
                char i = 0;//記錄商
                string tb = b;
                while (ta.size() > tb.size() || (ta.size() == tb.size() && ta > tb))//用多次減法實(shí)現(xiàn)除法運(yùn)算
                {
                    AddInt(tb, tb, b);
                    i++;
                }

                if (ta == tb)//整除
                {
                    c += i + '1';
                    a = a.substr(n, a.size()-n);
                    break;
                }
                else//余數(shù)不為0
                {
                    c += i + '0';
                    int pos = ta.size(); //記錄上一次被除數(shù)的增添位置
                    SubInt(tb, tb, b);//再減回去,使tb < ta
                    SubInt(ta, ta, tb);//獲取余數(shù)
                    n = ta.size();//下一次增添被除數(shù)位置
                    ta += a.substr(pos, a.size()-pos);//得到新的被除數(shù)
                    a = ta;
                }
            }
            else//被除數(shù)小于除數(shù),商為0
            {
                c += '0';
            }
        }
    }
   
    while (copyA.size() > c.size())//補(bǔ)足低位的0
        c += '0';
   
    //消除多余的高位0
    int pos = 0;
    while (pos < c.size() && c[pos] == '0')
    {
        pos++;
    }
    c = c.substr(pos, c.size()-pos);
   
    if (c.size() == 0)//商為0
        c = "0";
}

void PowInt(string & c, string a, string b)
{
    c.resize(0);
    if (a == "0")
    {
        c = "0";
        return ;
    }
   if (b == "0")
   {
        c = "1";
        return ;  
   }
   if (b == "1")
   {
        c = a;
        return ;  
   }
  
   string tb;
   DivInt(tb, b, "2");
   PowInt(c, a, tb);
   MulInt(c, c, c);
  
   if ((b[b.size()-1]-'0')%2 == 1)
       MulInt(c, c, a);
}


Posted on 2008-12-01 15:09 夢(mèng)想飛揚(yáng) 閱讀(578) 評(píng)論(3)  編輯 收藏 引用

Feedback

# re: 高精度運(yùn)算  回復(fù)  更多評(píng)論   

2008-12-12 21:33 by 本拉瘸
拜讀,不過(guò)我想寫(xiě)成類更好一點(diǎn).

# re: 高精度運(yùn)算  回復(fù)  更多評(píng)論   

2008-12-13 14:00 by 本拉瘸
不支持負(fù)數(shù)的運(yùn)算是一個(gè)瑕疵.也就是多點(diǎn)flag和a.at(0),b.at(0).

# re: 高精度運(yùn)算  回復(fù)  更多評(píng)論   

2008-12-13 18:37 by 本拉瘸
高精度乘除法有問(wèn)題.
比如 99 20

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            中文在线一区| 久久综合九色综合欧美就去吻| 久久久国产一区二区三区| 亚洲精品一品区二品区三品区| 亚洲电影在线免费观看| 美日韩精品免费| 亚洲高清毛片| 99精品免费视频| 欧美v日韩v国产v| 亚洲国产精品久久久久秋霞蜜臀| 免费视频最近日韩| 亚洲国产一区在线| 亚洲视频观看| 久久手机免费观看| 欧美私人网站| 在线欧美小视频| 一区二区三区不卡视频在线观看| 亚洲精品小视频在线观看| 欧美第一黄色网| 亚洲一级黄色片| 亚洲愉拍自拍另类高清精品| 浪潮色综合久久天堂| 欧美ab在线视频| 久久精品五月| 欧美日韩免费在线| 9久re热视频在线精品| 美女图片一区二区| 欧美影院久久久| 国产亚洲精品久久久久久| 亚洲一区二区视频在线| 亚洲免费电影在线观看| 美女爽到呻吟久久久久| 欧美剧在线观看| 悠悠资源网久久精品| 一本色道久久综合亚洲91| 久久人人97超碰精品888| 亚洲永久在线| 日韩午夜电影在线观看| 欧美激情一区二区三区高清视频| 欧美在线1区| 久久国产婷婷国产香蕉| 亚洲在线中文字幕| 在线视频日韩精品| 你懂的视频欧美| 久久久水蜜桃| 日韩一级精品视频在线观看| 亚洲国产人成综合网站| 午夜精品一区二区三区在线| 亚洲一区二区欧美| 亚洲精品在线电影| 欧美影院视频| 亚洲另类一区二区| 亚洲美女电影在线| 久久av老司机精品网站导航| 久久综合电影| 久久免费99精品久久久久久| 久久亚洲精品一区| 亚洲欧美在线另类| 一区二区在线观看av| 99精品欧美一区二区三区| 国产一区在线视频| 欧美中文在线字幕| 午夜久久久久久| 欧美午夜久久| 亚洲精品韩国| 国产午夜精品久久| 久久国产精彩视频| 亚洲第一精品夜夜躁人人躁| 欧美色图天堂网| 含羞草久久爱69一区| 欧美成人精品福利| 欧美三级欧美一级| 欧美影院精品一区| 蜜桃久久av一区| 午夜伦欧美伦电影理论片| 午夜久久影院| 午夜精品久久久久久久99黑人| 欧美激情1区2区3区| 欧美性开放视频| 亚洲国产小视频| 亚洲人精品午夜| 亚洲欧美春色| 欧美激情影音先锋| 一区二区高清视频在线观看| 一本色道久久综合狠狠躁篇的优点| 欧美精品xxxxbbbb| 久久精品亚洲精品| 欧美视频中文字幕| 亚洲大片在线观看| 国产欧美日韩在线播放| 亚洲国产精品专区久久| 欧美视频导航| 亚洲自拍另类| 亚洲一区3d动漫同人无遮挡| 欧美日韩在线播放一区| 欧美国产乱视频| 香蕉久久久久久久av网站| 国产精品久久波多野结衣| 一区二区三区高清| 久久精品人人做人人爽| 在线播放豆国产99亚洲| 亚洲国产精品第一区二区 | 一本色道久久综合亚洲精品高清| 亚洲综合第一页| 欧美成人中文字幕| 久久99在线观看| 午夜视频在线观看一区| 99热精品在线观看| 国产精品99久久久久久久vr| 在线中文字幕不卡| 欧美三级视频在线播放| 欧美视频一区二区三区在线观看| 亚洲日本一区二区| 亚洲国产日韩一级| 欧美日韩在线播放一区二区| 欧美国产第二页| 欧美一区日韩一区| 久久久综合视频| 久久久久久91香蕉国产| 亚洲免费av网站| 一区二区三区免费看| 国产亚洲成av人片在线观看桃 | 亚洲视频一区二区| 在线观看成人网| 亚洲女人小视频在线观看| 亚洲伦理网站| 久久久亚洲精品一区二区三区 | 国产日韩欧美| 一区二区三区毛片| 一区二区三区黄色| 欧美日韩第一区| 亚洲日本久久| 亚洲国产天堂久久综合| 久久久久久久999| 久久久噜噜噜久久久| 国产午夜亚洲精品理论片色戒 | 免费欧美网站| 欧美粗暴jizz性欧美20| 国产在线乱码一区二区三区| 亚洲影院在线观看| 欧美一区二区三区视频免费| 国产精品hd| 亚洲欧美成人网| 久久成年人视频| 国产综合婷婷| 久久久久久久久蜜桃| 欧美激情一区二区三区全黄| 亚洲国产成人91精品| 亚洲国产精品免费| 欧美国产日韩精品免费观看| 亚洲激情另类| 亚洲一区二区在线视频| 国产精品成人观看视频免费 | 久久夜色精品国产亚洲aⅴ| 国内精品免费在线观看| 久久久午夜精品| 亚洲国产日韩欧美| 国产精品99久久不卡二区 | 99re66热这里只有精品3直播| 欧美激情a∨在线视频播放| 亚洲福利视频一区| 欧美激情亚洲另类| 亚洲一区网站| 免费在线观看成人av| 亚洲精品小视频| 国产精品一区二区三区久久久| 欧美一区二区三区在线看| 久久综合一区| 欧美精品网站| 亚洲在线一区二区三区| 久久夜色精品亚洲噜噜国产mv | 美女黄网久久| 一区二区三区久久久| 久久天堂精品| 99精品国产在热久久下载| 国产精品国产自产拍高清av| 先锋影音国产精品| 亚洲日本va午夜在线电影| 久久国产高清| 在线综合亚洲| 1000部国产精品成人观看| 欧美日韩成人综合在线一区二区| 欧美在线观看视频一区二区三区| 亚洲国产导航| 久久www成人_看片免费不卡 | 久久国产精品第一页| 日韩视频永久免费观看| 国产亚洲高清视频| 欧美日韩一区二区欧美激情 | 久久精品日产第一区二区三区 | 欧美一区在线直播| 99亚洲伊人久久精品影院红桃| 久久亚洲综合色| 性色av香蕉一区二区| 亚洲美女区一区| 亚洲高清成人| 国产中文一区二区| 国产精品婷婷午夜在线观看| 欧美国产视频一区二区| 老牛国产精品一区的观看方式|