高精度重載0.2

来源:http://www.cnblogs.com/Alpha-Wendy/archive/2017/11/01/7764836.html
-Advertisement-
Play Games

說明 嚴格意義上這個純模版不算原創,但是已經是理解整理後的 (加入我的代碼風格) 因為當時開了好幾個網頁,找不到參考 (包括但不限於高精度演算法( =4),n進位轉m進位( =2),c++重載運算符( =3)) 了, 如果原作者 (內容主要是來自那個模版) 看到,可以聯繫我,我會在開頭加入參考鏈接 適 ...


高精度重載


說明

    嚴格意義上這個純模版不算原創,但是已經是理解整理後的 (加入我的代碼風格)
    因為當時開了好幾個網頁,找不到參考 (包括但不限於高精度演算法(>=4),n進位轉m進位(>=2),c++重載運算符(>=3)) 了,如果原作者 (內容主要是來自那個模版) 看到,可以聯繫我,我會在開頭加入參考鏈接.
    含適用於k進位的演算法.
    可能有空時用string改寫(可以省去已經在庫中重載過的部分).

原始模版

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int ma=100;//數據位數
//求階乘
struct bu
{
    int a[ma],len;
    void ti(){while(len>1&&!a[len-1]) len--;}//清除多餘的零
    bu() {memset(a,0,sizeof(a));len=1;}//初始化
    bu(const int num){*this=num;}//*this是一個關鍵字,但是在某些編輯器下不顯示而已
    bu(const char *num){*this=num;}
    bu operator =(const char*num)
    {
        memset(a,0,sizeof(a));
        len=strlen(num);
        for(int i=0;i<len;i++)
            a[i]=num[len-1-i]-'0';
        ti();
        return *this;
    }
    bu operator =(const int num)
    {
        char c[20];sprintf(c,"%d",num);
        *this=c;
        return *this;
    }
    bu operator + (const bu &c)
    {
        int i;bu b=*this;
        for(i=0;i<c.len;i++)
        {
            b.a[i]+=c.a[i];
            if(b.a[i]>9){b.a[i]%=10;b.a[i+1]++;}
        }
        while(b.a[i]>9){b.a[i++]%=10;b.a[i]++;}
        b.len=max(len,c.len);
        if(b.a[i]&&b.len<i+1) b.len=i+1;
        return b;
    }
    bu operator - (const bu &c)
    {
        bu b=*this;int i;
        for(i=0;i<c.len;i++)
                {
            b.a[i]-=c.a[i];
            if(b.a[i]<0){b.a[i]+=10;b.a[i+1]--;}
        }
        while(b.a[i]<0){b.a[i++]+=10;b.a[i]--;}
        b.ti();
        return b;
    }
    bu operator * (const bu &c)const{
        int i,j;bu b;b.len=len+c.len;
        for(i=0;i<c.len;i++)
            for(j=0;j<len;j++)
                b.a[i+j]+=a[j]*c.a[i];
        for(i=0;i<b.len-1;i++)
            b.a[i+1]+=b.a[i]/10,b.a[i]%=10;
        b.ti();
        return b;
    }
    bu operator / (const bu &c){
        int i,j;bu b=*this,d=0;
        for(i=len-1;i>=0;i--)
        {
            d=d*10+a[i];
            for(j=0;j<10;j++)
                if(d<c*(j+1)) break;
            b.a[i]=j;
            d=d-c*j;
        }
        b.ti();
        return b;
    }
    bu operator % (const bu &c){
        int i,j;bu d=0;
        for(i=len-1;i>=0;i--)
                {
            d=d*10+a[i];
            for(j=0;j<10;j++)
                if(d<c*(j+1)) break;
            d=d-c*j;
        }
        return d;
    }
    bu operator += (const bu&c)
        {
        *this=*this+c;
        return *this;
    }
    bool operator < (const bu &c)const{
        if(len!=c.len) return len<c.len;
        for(int i=len-1;i>=0;i--)
            if(a[i]!=c.a[i]) return a[i]<c.a[i];
        return false;
    }
    bool operator > (const bu &c)const{return c<*this;}
    bool operator <= (const bu &c)const{return !(c<*this);}
    bool operator >= (const bu &c)const{return !(*this<c);}
    bool operator != (const bu &c)const{return c<*this||*this<c;}
    bool operator == (const bu &c)const{return !(c<*this||*this<c);}
    string str()
        {
        char c[ma]={};
        for(int i=0;i<len;i++)
            c[len-1-i]=a[i]+'0';
        return c;
    }
};//重載運算符報錯時可能是漏了';'
istream& operator >> (istream& in, bu& x)//重載cin>>
{
    string s;
    in >> s;
    x = s.c_str();
    return in;
}

ostream& operator << (ostream& out, bu& x)//重載cout<<
{
    out << x.str();
    return out;
}
int main()
{
    int n;cin>>n;
    bu x=1,y=0;
    for(int i=1;i<=n;i++)
    {
        x=x*i;
        y+=x;
    }
    cout<<y;
    return 0;
}

洛谷P1015

求出現迴文數的次數 (每次反過來加)

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int ma=2000;
int n;//n進位
struct bu
{
    int a[ma],len;
    void ti(){while(len>1&&!a[len-1]) len--;}
    bu() {memset(a,0,sizeof(a));len=1;}
    bu(const int num){*this=num;}
    bu(const char *num){*this=num;}
    bu operator =(const char*num)
    {
        memset(a,0,sizeof(a));
        len=strlen(num);
        for(int i=0;i<len;i++)
        {
            if(num[len-1-i]<'A') a[i]=num[len-1-i]-'0';
            else a[i]=num[len-1-i]-'A'+10;
        }
        ti();
        return *this;
    }
    bu operator =(const int num)
    {
        char c[22];sprintf(c,"%d",num);
        *this=c;
        return *this;
    }
    bu operator -=(const bu&c)
    //這裡是定義-=表示這個數反過來,即:
    //例:c=78 則*this=87
    {
        len=c.len;
        for(int i=0;i<c.len;i++)
            a[c.len-i-1]=c.a[i];
        ti();
        return *this;
    }
    bu operator + (const bu &c)
    {
        int i;bu b=*this;
        for(i=0;i<c.len;i++)
        {
            b.a[i]+=c.a[i];
            if(b.a[i]>(n-1)){b.a[i]%=n;b.a[i+1]++;}
        }
        while(b.a[i]>(n-1)){b.a[i++]%=n;b.a[i]++;}
        b.len=max(len,c.len);
        if(b.a[i]&&b.len<i+1) b.len=i+1;
        return b;
    }
    bu operator += (const bu&c)
    {
        *this=*this+c;
        return *this;
    }
    string str()
    {
        char c[ma]={};
        for(int i=0;i<len;i++)
            c[len-1-i]=a[i]+'0';
        return c;
    }
};
istream& operator >> (istream& in, bu& x)
{
    string s;
    in >> s;
    x = s.c_str();
    return in;
}
bool ju(bu t)
{
    for(int i=0;i<t.len;i++)
    {
        if(t.a[i]!=t.a[t.len-i-1])
            return true;
    }
    return false;
}
int main()
{
    cin>>n;
    bu t1,t2;
    char t3[101];
    cin>>t3;
    t1=t3;
    int c=0;bool flag=ju(t1);
    while(flag&&c<=30)
    {
        t2-=t1;//將t1反過來
        t1+=t2;
        c++;
        flag=ju(t1);
    }
    if(flag||c>30) cout<<"Impossible!"<<endl;
    else cout<<"STEP="<<c<<endl;
    return 0;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文是基於嵌入式的C語言 首先弄明白程式是什麼?電腦為什麼需要編程? 編寫程式的目的是為了去運行,從而得到一些結果。顧名思義電腦就是用來計算的,所以電腦的所有程式就是在計算,那麼電腦在計算什麼呢?當然是在計算數據,因此,數據是程式的重要組成。推出:電腦程式 = 代碼 + 數據。那麼程式運行 ...
  • import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import java.util.Set; import javax.servlet.http.HttpServletRequest; public st ...
  • 點擊試聽課程 前言 點擊試聽課程 前言 很多自學編程的同學經常和我說想學一門語言自己到網上找一些教程看到一半就像背單詞背到ambulance一樣堅持不下去了....究其原因基本上都是:內容太多,太枯燥,專業術語聽不懂,學的不知道能幹嘛,學到一半就放棄了...確實從零學習編程是一個很枯燥的事,所以在想 ...
  • 用到查看當前目錄的完整路徑使用:pwd 物理路徑和連接路徑什麼鬼?沒明白暫時借鑒別人的記錄下 顯示當前目錄的物理路徑 pwd –P 1: [root@DB-Server init.d]# cd /etc/init.d 2: [root@DB-Server init.d]# pwd -P 3: /et ...
  • JSTL簡介 用的時候: ...
  • 我們可以通過這樣子的方式去理解apache的工作原理 1 單進程TCP服務(堵塞式) 這是最原始的服務,也就是說只能處理個客戶端的連接,等當前客戶端關閉後,才能處理下個客戶端,是屬於阻塞式等待 這種阻塞型自然不適合處理多客戶端的請求,於是有了改版 2 多進程服務 採取多進程處理多客戶端連接請求,對單 ...
  • 一、引用類型有哪些 類 介面 數組 枚舉 註解 以上五種為引用數據類型, 我們現在學了其中的兩種 使用new關鍵字創建出來的類型都是引用數據類型 二、什麼是地址傳遞 引用數據類型有兩塊存儲空間 一個在棧(Stack)中,一個在堆(heap)中。 棧中存放的是堆中的地址 當我們把引用類型當作參數傳遞時 ...
  • jvm 垃圾回收 註意 : 本系列文章為學習系列,部分內容會取自相關書籍或者網路資源,在文章中間和末尾處會有標註 垃圾回收的意義 它使得java程式員不再時時刻刻的關註記憶體管理方面的工作. 垃圾回收機制會自動的管理jvm記憶體空間,將那些已經不會被使用到了的"垃圾對象"清理掉",釋放出更多的空間給其他 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...