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

/*
  Name: 高精度運(yùn)算
  Copyright:始發(fā)于goal00001111的專(zhuān)欄;允許自由轉(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) 閱讀(586) 評(píng)論(3)  編輯 收藏 引用

Feedback

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

2008-12-12 21:33 by 本拉瘸
拜讀,不過(guò)我想寫(xiě)成類(lèi)更好一點(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è)用戶(hù)登錄后才能發(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>
            亚洲日本中文字幕免费在线不卡| 久久国产精品久久国产精品| 亚洲在线观看视频网站| 激情综合色综合久久| avtt综合网| 亚洲欧洲日本mm| 欧美在线观看一二区| av成人免费| 美女精品国产| 久热国产精品视频| 国产欧美日韩中文字幕在线| 亚洲免费观看高清完整版在线观看熊| 狠狠综合久久av一区二区小说| 中日韩美女免费视频网址在线观看| 亚洲国产精品一区在线观看不卡| 亚洲欧美在线播放| 亚洲在线中文字幕| 欧美日韩一区二区在线 | 亚洲丶国产丶欧美一区二区三区| 亚洲自拍偷拍色片视频| 亚洲素人一区二区| 欧美日韩一区精品| 99亚洲伊人久久精品影院红桃| 亚洲激情视频在线| 免费在线日韩av| 欧美国产精品日韩| 91久久综合| 农村妇女精品| 欧美不卡视频一区| 亚洲欧洲日本专区| 欧美国产日产韩国视频| 亚洲国产小视频在线观看| 在线播放中文字幕一区| 麻豆精品一区二区综合av| 欧美国产大片| 亚洲免费观看高清完整版在线观看熊 | 久久日韩粉嫩一区二区三区| 国产一区二区三区在线播放免费观看 | 女同性一区二区三区人了人一| 美女任你摸久久| 91久久精品久久国产性色也91 | 久久黄色网页| 男女av一区三区二区色多| 亚洲国产婷婷香蕉久久久久久| 欧美成人亚洲成人| 一本色道久久88亚洲综合88| 先锋亚洲精品| 怡红院精品视频| 欧美成人黄色小视频| 日韩小视频在线观看| 午夜一区二区三区不卡视频| 国产一区二区三区在线观看免费 | 欧美寡妇偷汉性猛交| 99精品欧美一区二区三区| 午夜精品婷婷| 亚洲成色777777在线观看影院| 免费一区二区三区| 亚洲视频一区在线| 久久影视三级福利片| 99成人在线| 国产日韩欧美高清| 牛牛国产精品| 亚洲在线视频观看| 亚洲国产精品va在线看黑人| 亚洲男女自偷自拍图片另类| 国产一区二区日韩| 欧美激情视频在线免费观看 欧美视频免费一 | 老司机一区二区三区| 亚洲欧洲一区| 国产日韩欧美亚洲| 欧美激情精品久久久| 午夜精品久久久久久久白皮肤 | 欧美激情第3页| 亚洲综合色在线| 亚洲国产高清自拍| 国产精品女主播一区二区三区| 久久亚洲精品一区| 一区二区三区日韩精品| 麻豆精品视频在线观看| 亚洲无吗在线| 亚洲国产精品久久久久秋霞影院| 国产精品v片在线观看不卡| 麻豆精品视频| 久久精品国产亚洲5555| 亚洲精品在线一区二区| 久久午夜精品一区二区| 亚洲综合成人婷婷小说| 亚洲欧洲日韩综合二区| 韩国精品在线观看| 国产精品有限公司| 欧美日韩国产美| 免费欧美高清视频| 久久久精品一品道一区| 性高湖久久久久久久久| 在线综合亚洲| 99ri日韩精品视频| 最新国产成人av网站网址麻豆| 免费看精品久久片| 久久夜色撩人精品| 久久视频国产精品免费视频在线| 亚洲女ⅴideoshd黑人| 夜夜嗨av一区二区三区| 亚洲毛片在线观看| 亚洲激情在线激情| 亚洲国产免费看| 亚洲国产精品电影| 一色屋精品视频免费看| 黑丝一区二区| 狠狠爱www人成狠狠爱综合网 | 欧美四级在线观看| 欧美人妖另类| 欧美日韩高清在线一区| 欧美日韩国产一级| 欧美日韩欧美一区二区| 欧美日韩高清在线观看| 欧美日韩在线播放三区| 欧美日韩一区在线观看| 欧美性开放视频| 国产精品家教| 国产欧美日韩一区二区三区| 国产精品入口福利| 国产欧美精品va在线观看| 国产免费成人| 狠狠色狠狠色综合人人| 亚洲国产精品成人va在线观看| 亚洲国产精品女人久久久| 亚洲国产婷婷综合在线精品 | 欧美与黑人午夜性猛交久久久| 欧美中文字幕在线观看| 久久婷婷av| 免费国产一区二区| 欧美日韩国产综合视频在线| 国产精品乱码| 很黄很黄激情成人| 日韩视频在线观看免费| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲一区二区三区欧美| 久久久久久9| 欧美激情在线观看| 在线亚洲一区二区| 久久久天天操| 欧美日韩在线三级| 国产午夜久久| 亚洲日本国产| 午夜欧美大片免费观看| 欧美gay视频激情| 一区二区av在线| 欧美一级片一区| 欧美国产日产韩国视频| 国产三级欧美三级| 夜夜嗨一区二区三区| 久久久国产精品一区二区中文| 欧美电影打屁股sp| 亚洲免费视频中文字幕| 久久只精品国产| 国产精品久久久久久久浪潮网站| 雨宫琴音一区二区在线| 亚洲欧美久久久| 欧美成人一区二区三区片免费| 亚洲视频欧美在线| 欧美成人在线影院| 国产亚洲一级| 亚洲一区二区高清视频| 免费人成精品欧美精品| 亚洲一区二区在线播放| 欧美暴力喷水在线| 国产亚洲精品综合一区91| 日韩午夜激情av| 久久综合图片| 亚洲午夜小视频| 欧美人与性动交cc0o| 亚洲国产毛片完整版| 久久精品91久久久久久再现| 亚洲美女av黄| 欧美91大片| 在线成人中文字幕| 久久精品综合一区| 亚洲女同性videos| 欧美午夜在线观看| 中日韩在线视频| 亚洲国产福利在线| 久久久久成人精品| 国产专区欧美精品| 久久xxxx精品视频| 亚洲免费视频观看| 国产美女一区二区| 午夜久久久久久久久久一区二区| 亚洲欧洲精品一区二区三区| 久久蜜臀精品av| 伊人色综合久久天天| 久久艳片www.17c.com| 亚洲欧美在线看| 国产精品尤物福利片在线观看| 亚洲欧美激情四射在线日| 亚洲深爱激情| 国产精品亚洲产品| 久久成人精品| 久久国产高清| 精品1区2区3区4区| 女主播福利一区|