就一個簡單的大數計算

來源:互聯網
上載者:User

標籤:c++

也只是剛剛寫出了加法,用的是1 000 000 000進位,不過發現對於加法還不如用最基本的方法方便。用1 000 000 000進位的方便也就在於處理乘法和除法了。電腦做乘除運算還是比較耗時的。

#include <random>#include <iostream>#include <fstream>#include <string>#include <vector>#include <utility>using namespace std;const int MaxNum=1000000000; //進位class BigNumCalcu{public:    const static int N=9;    BigNumCalcu():num_1(""),result(""),numSize_1(0),numSize_2(0){  //init        num_2="";    fopen.open("num.txt");    }    string patchZero(int M); //補0  void getInput();   //讀取資料  void SplitNum();   void Sum();      //加法  string Sub();      //減法  void Multi();    //乘法  string Div();      //除法  void randomData();private:  fstream fopen;  vector<int> BitNum_1,BitNum_2;  string num_1,num_2,result;  unsigned int numSize_1;  unsigned int numSize_2;};void BigNumCalcu::getInput(){  for(int i=0;i!=5;++i){    result="";    BitNum_1.clear();    BitNum_2.clear();    fopen>>num_1>>num_2;    cout<<"num_1: "<<num_1<<"  num_2: "<<num_2<<endl;    SplitNum();    Sum();  }}void BigNumCalcu::SplitNum(){  numSize_1=(num_1.size()%9==0) ? num_1.size()/9 : num_1.size()/9+1;  numSize_2=(num_2.size()%9==0) ? num_2.size()/9 : num_2.size()/9+1;  //split  if(numSize_1==num_1.size()/9)    for(int index=1;index<=numSize_1;++index)      BitNum_1.push_back(std::stoi(num_1.substr(num_1.size()-index*BigNumCalcu::N,9)));  else    for(int index=1;index<=numSize_1;++index){      if(index==numSize_1)    BitNum_1.push_back(std::stoi(num_1.substr(0,num_1.size()-(index-1)*BigNumCalcu::N)));      else    BitNum_1.push_back(std::stoi(num_1.substr(num_1.size()-index*BigNumCalcu::N,9)));            }  if(numSize_2==num_2.size()/9)    for(int index=1;index<=numSize_2;++index)      BitNum_2.push_back(std::stoi(num_2.substr(num_2.size()-index*BigNumCalcu::N,9)));  else    for(int index=1;index<=numSize_2;++index){      if(index==numSize_2)    BitNum_2.push_back(std::stoi(num_2.substr(0,num_2.size()-(index-1)*BigNumCalcu::N)));      else    BitNum_2.push_back(std::stoi(num_2.substr(num_2.size()-index*BigNumCalcu::N,9)));            }}string BigNumCalcu::patchZero(int M){  auto it=std::to_string(M).size();  string temp=std::to_string(M);  if(it<BigNumCalcu::N){    for(;it<BigNumCalcu::N;it++)      temp="0"+temp;    return result=temp+result;  }  else    return result=std::to_string(M);}void BigNumCalcu::Sum(){  int min=std::min(numSize_1,numSize_2);  int index=0;  //進位  int sum=0;  //如果兩個數字具有相同的位元  //如果兩個數字位元不一樣  if(min==numSize_1)    for(int count=min;count<numSize_2;++count)      if((sum=BitNum_2[count]+index)>=MaxNum){    index=1;    result=patchZero(sum-MaxNum);      }      else{    index=0;    result=patchZero(sum);      }  else    for(int count=min;count<numSize_1;++count)      if((sum=BitNum_1[count]+index)>=MaxNum){    index=1;    result=patchZero(sum-MaxNum);      }      else{    index=0;    result=patchZero(sum);      }  //如果最高位也需要進位  if(index==1)    result="1"+result;  cout<<result<<endl;}int main(int argc,char **argv){  BigNumCalcu Calc;  Calc.getInput();  return 0;}

下面是一個python測試。因為python已經內建大整數計算了

__author__=‘MarkLiang‘#coding=utf-8fopen=open(‘num.txt‘,‘r‘)for num1 in fopen:    num2=fopen.readline();    print("result: ",int(num1)+int(num2))fopen.close()

至於乘法和除法,我有空在寫吧。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

就一個簡單的大數計算

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.