最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)高精度加法的示例代碼

 更新時間:2023年11月05日 09:35:43   作者:涼茶coltea  
高精度的本質(zhì)是將數(shù)字以字符串的形式讀入,然后將每一位分別存放入int數(shù)組中,通過模擬每一位的運算過程,來實現(xiàn)最終的運算效果,下面我們就來看看如何通過C語言實現(xiàn)高精度加法吧

介紹

眾所周知,整數(shù)在C和C++中以int ,long,long long三種不同大小的數(shù)據(jù)存儲,數(shù)據(jù)大小最大可達2^64,但是在實際使用中,我們?nèi)圆豢杀苊獾臅龅奖?code>long long的超大數(shù)運算,這個時候,就需要我們使用高精度算法,來實現(xiàn)巨大數(shù)的運算。

高精度的本質(zhì)是將數(shù)字以字符串的形式讀入,然后將每一位分別存放入int數(shù)組中,通過模擬每一位的運算過程,來實現(xiàn)最終的運算效果。

今天,我們先講解高精度加法的C語言實現(xiàn):

聲明

但其實我這版C語言的高精度算法封裝是很有問題的,沒有stl,字符串的操作是比較繁瑣的,以后熟悉C++后我會再寫一版簡易的,標(biāo)準(zhǔn)的高精度算法解析,但通過本文了解高精度的思路也是沒有問題的。

代碼實現(xiàn)

#include<stdio.h>
const int N = 100001;

int add(int a[], int b[], int c[], int len1, int len2)
{
    int t = 0, i = 0, max = len1 > len2 ? len1 : len2;
    //max指兩加數(shù)中較大者的位數(shù),兩數(shù)之和c位數(shù)至少是max
    //標(biāo)識變量t值為0或1,代表是否進位,初始為0
    for (; i <= max; i++)//運算到較大者位數(shù)后一位停止
    {
        c[i] = (a[i] + b[i] +t) % 10;//c的每一位為兩數(shù)該位之和加上t再模去10
        t = (a[i] + b[i] + t) / 10;//若和>10,則c[i]取其個位,t取其十位
    }//i遍歷至max+1
    if (c[i - 1] == 1)  return i;//若最高位為1,則返回c長度為max+1,即i
    else  return i - 1;//否則返回max,即i-1
}

int main()
{
    char str1[N], str2[N];//兩個數(shù)的字符串形式
    int a[N] = { 0 }, b[N] = { 0 }, c[N] = { 0 };//ab為加數(shù),c為和
    char x;
    int len1 = 0, len2 = 0;//兩數(shù)位數(shù)
    do {
        scanf("%c", &x);
        str1[len1++] = x;
    }while (x != '\n');
    do{
        scanf("%c", &x);
        str2[len2++] = x;
    } while (x != '\n');
    len1--; len2--;//將數(shù)據(jù)讀入str1和str2,同時記錄位數(shù)
    for (int i = len1 - 1; i >= 0; i--)
        a[i] = str1[len1 - i - 1]-'0';
    for (int i = len2 - 1; i >= 0; i--)
        b[i] = str2[len2 - i - 1] - '0';//將ab的每一位轉(zhuǎn)換為整形存入數(shù)組
    int len3 = add(a, b, c, len1, len2);//執(zhí)行高精度加法函數(shù)
    for (int i = len3 - 1; i >= 0; i--)
        printf("%d", c[i]);//輸出
    return 0;
}

思路分析

對大數(shù)來說,輸入便已經(jīng)是一個有些麻煩的問題,無法讀取整形,只能以字符串形式,而且連有幾位數(shù)字都不知道。

    char str1[N], str2[N];//兩個數(shù)的字符串形式
    int a[N] = { 0 }, b[N] = { 0 }, c[N] = { 0 };//ab為加數(shù),c為和
    char x;
    int len1 = 0, len2 = 0;//兩數(shù)位數(shù)
    do {
        scanf("%c", &x);
        str1[len1++] = x;
    }while (x != '\n');
    do{
        scanf("%c", &x);
        str2[len2++] = x;
    } while (x != '\n');
    len1--; len2--;//將數(shù)據(jù)讀入str1和str2,同時記錄位數(shù)

這里是主函數(shù)的變量聲明和輸入部分,若是程序只運行一次高精度運算,我們可以把變量的聲明放在主函數(shù)以外,來能減少函數(shù)的參數(shù)個數(shù)。

我們將讀取的字符賦值給x,然后再放入字符串?dāng)?shù)組,最后對x進行判斷,若x為換行符、空格或其他標(biāo)識著數(shù)據(jù)輸入結(jié)束的字符,則終止循環(huán)。

同時,循環(huán)中變化的數(shù)組下標(biāo)我們直接記為len1len2,代表兩個數(shù)字的長度。

顯然,字符形式的數(shù)字并不好運算,所以,我們需要將每一位轉(zhuǎn)換為整形存入數(shù)組,方便后續(xù)的計算。

那此時我們就會遇到一個問題,數(shù)組的第0位應(yīng)該存放最高位還是存放個位呢?先看代碼實現(xiàn):

    for (int i = len1 - 1; i >= 0; i--)
        a[i] = str1[len1 - i - 1]-'0';
    for (int i = len2 - 1; i >= 0; i--)
        b[i] = str2[len2 - i - 1] - '0';//將ab的每一位轉(zhuǎn)換為整形存入數(shù)組

在這段函數(shù)中,我們從高位向低位,將每一位的字符-'0',得到他的整形,然后存入數(shù)組,最終得到從低位到高位的新數(shù)組。

為什么要反過來存放呢,這就要考慮到一個最高位進位的問題。

數(shù)組后面存放最高位,在最高位進位時顯然比最高位放在第0位操作起來更方便,前者只需要在下一位+1,而后者想要進位,可能只能依靠于額外的標(biāo)記變量了。

這種問題在后面的高精度乘法中更是明顯,所以,在高精度運算中,為了使高位靈活變動,我們一般都采用倒序的存放順序,即數(shù)組前面存低位,后面存高位。

到這里,我們就將準(zhǔn)備工作做完了,數(shù)字已經(jīng)放入數(shù)組,長度也已得知,這時我們就需要寫一個函數(shù)來運行高精度加法,代碼如下:

int add(int a[], int b[], int c[], int len1, int len2)
{
    int t = 0, i = 0, max = len1 > len2 ? len1 : len2;
    //max指兩加數(shù)中較大者的位數(shù),兩數(shù)之和c位數(shù)至少是max
    //標(biāo)識變量t值為0或1,代表是否進位,初始為0
    for (; i <= max; i++)//運算到較大者位數(shù)后一位停止
    {
        c[i] = (a[i] + b[i] +t) % 10;//c的每一位為兩數(shù)該位之和加上t再模去10
        t = (a[i] + b[i] + t) / 10;//若和>10,則c[i]取其個位,t取其十位
    }//i遍歷至max+1
    if (c[i - 1] == 1)  return i;//若最高位為1,則返回c長度為max+1,即i
    else  return i - 1;//否則返回max,即i-1
}

雖然圖中解析已經(jīng)非常到位了,但我還是簡單講解一下吧。

首先從i=0位開始,將a[i]b[i]t相加,其個位便是c在該位的值,所以我們對他模上10,其大于10時需要進位,那我們就將其除以10,整形除法下取整,得到10,作為t的值,來參與下一位的運算。

最后,我們通過對最高位的01判斷,來決定返回max還是max+1。

這時,我們已經(jīng)將結(jié)果存入c了,只差輸出了,但想要輸出我們怎么知道c有幾位呢?最高位到底有沒有進位呢?那其實我們的函數(shù)返回值就是c的長度了。

    int len3 = add(a, b, c, len1, len2);//執(zhí)行高精度加法函數(shù)
    for (int i = len3 - 1; i >= 0; i--)
        printf("%d", c[i]);//輸出

這樣,我們從后往前一位位輸出,就得出了最終結(jié)果了。

總結(jié)

總而言之言而總之,高精度算法就是單獨將每一位數(shù)字存入數(shù)組,分別計算,模擬我們手動計算的過程,接下來的減法和乘法除法的核心思想都是這個,那么以上便是對高精度加法算法的介紹,本文由涼茶coltea撰寫,思路來自AcWing,大佬yxc的課程。

到此這篇關(guān)于C語言實現(xiàn)高精度加法的示例代碼的文章就介紹到這了,更多相關(guān)C語言高精度加法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C中的volatile使用方法

    C中的volatile使用方法

    volatile 影響編譯器編譯的結(jié)果,指出,volatile 變量是隨時可能發(fā)生變化的,與volatile變量有關(guān)的運算,不要進行編譯優(yōu)化,以免出錯
    2013-02-02
  • C++虛函數(shù)的實現(xiàn)機制分析

    C++虛函數(shù)的實現(xiàn)機制分析

    這篇文章主要介紹了C++虛函數(shù)的實現(xiàn)機制分析,需要的朋友可以參考下
    2014-07-07
  • C語言實現(xiàn)繪制貝塞爾曲線的函數(shù)

    C語言實現(xiàn)繪制貝塞爾曲線的函數(shù)

    貝塞爾曲線,又稱貝茲曲線或貝濟埃曲線,是應(yīng)用于二維圖形應(yīng)用程序的數(shù)學(xué)曲線。本文將利用C語言實現(xiàn)繪制貝塞爾曲線的函數(shù),需要的可以參考一下
    2022-12-12
  • C++ 中的Lambda表達式寫法

    C++ 中的Lambda表達式寫法

    在 C++ 11 中,lambda 表達式(通常稱為 “l(fā)ambda”)是一種在被調(diào)用的位置或作為參數(shù)傳遞給函數(shù)的位置定義匿名函數(shù)對象的簡便方法,下面通過本文給大家介紹C++ 中的Lambda表達式寫法,需要的朋友參考下吧
    2017-02-02
  • 一些語言的按行讀取文件的代碼實現(xiàn)小結(jié)

    一些語言的按行讀取文件的代碼實現(xiàn)小結(jié)

    這篇文章主要介紹了一些語言的按行讀取文件的代碼實現(xiàn)小結(jié),這里羅列了Java和C語言和C++以及PHP的實現(xiàn)需要的朋友可以參考下
    2015-08-08
  • C++中一維數(shù)組與指針的關(guān)系詳細總結(jié)

    C++中一維數(shù)組與指針的關(guān)系詳細總結(jié)

    以下是對C++中一維數(shù)組與指針的關(guān)系進行了詳細的總結(jié)介紹,需要的朋友可以過來參考下
    2013-09-09
  • C/C++指針和取地址的方法

    C/C++指針和取地址的方法

    C/C++指針和取地址的方法,需要的朋友可以參考一下
    2013-04-04
  • 如何用C++實現(xiàn)A*尋路算法

    如何用C++實現(xiàn)A*尋路算法

    尋路是游戲比較重要的一個組成部分。因為不僅AI還有很多地方(例如RTS游戲里操控人物點到地圖某個點,然后人物自動尋路走過去)都需要用到自動尋路的功能。本文將介紹一個經(jīng)常被使用且效率理想的尋路方法-A*尋路算法,并且提供額外的優(yōu)化思路
    2021-06-06
  • C語言中的二叉樹和堆詳解

    C語言中的二叉樹和堆詳解

    這篇文章主要介紹了C語言中的二叉樹和堆詳解,樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n>=0)個有限結(jié)點組成一個具有層次關(guān)系的集合,把它叫做樹是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的,需要的朋友可以參考下
    2023-07-07
  • C語言三子棋小游戲的實現(xiàn)

    C語言三子棋小游戲的實現(xiàn)

    這篇文章主要為大家詳細介紹了C語言三子棋小游戲的實現(xiàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評論

新源县| 淮阳县| 江达县| 太湖县| 无为县| 宁海县| 彩票| 丰宁| 吐鲁番市| 武功县| 砀山县| 江孜县| 九寨沟县| 洪湖市| 富平县| 克山县| 达孜县| 延津县| 京山县| 桑植县| 昆明市| 龙州县| 白山市| 绥中县| 侯马市| 高雄市| 南投县| 两当县| 陆良县| 宣恩县| 安徽省| 永济市| 康乐县| 扶沟县| 奉贤区| 民勤县| 南宫市| 安岳县| 建德市| 汪清县| 象州县|