国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言 加減乘除模 的 高精度計算 (超詳細)

這篇具有很好參考價值的文章主要介紹了C語言 加減乘除模 的 高精度計算 (超詳細)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

高精度加法

高精度乘法

高精度減法

? ? ? ? ?高精度除法

高精度模法


?文章來源地址http://www.zghlxwxcb.cn/news/detail-423933.html

高精度計算是模擬算法的一種,通過字符串和整型數組的使用,將加減乘除的豎式運算模擬出來,達到計算的目的。其步驟大致分為:一,將字符串數據存到整型數組中,二,模擬算法,不同的算式對準不同的模擬代碼,三,將保存的數據轉移。

高精度加法

void addhigh(char a[],char b[],char res[])//a,b分別為兩個加數的字符串,res返回答案
{
    int a_num[2005],b_num[2005];            //保存字符串a,b的數組
    for(int i=0;i<2005;i++)                 //初始化,保證開始每位上數字為0
        a_num[i]=0,b_num[2005]=0;

//因為在豎式運算中我們是從低位算起,所以我們倒序將a,b存到數組里
    for(int i=strlen(a)-1,j=0;i>=0;i--,j++) //倒序將a保存為數組,方便每一位的模擬
        a_num[j]=a[i]-'0';
    for(int i=strlen(b)-1,j=0;i>=0;i--,j++) //倒序將b保存為數組,方便每一位的模擬
        b_num[j]=b[i]-'0';
    int lenth_max = strlen(a)>strlen(b)?strlen(a):strlen(b); //計算長度,方便記錄位數
    for(int i=0;i<lenth_max;i++) //加法運算的核心,其他(乘法減法)都是這里來實現
    {
        a_num[i]+=b_num[i];                 //a的每一位加上b的每一位;
        if(a_num[i]>=10)                    //因為是十進制,
            a_num[i+1]+=a_num[i]/10;        //下一位加上該為的10的除數,模擬進位
            a_num[i]=a_num[i]%10;           //大于十我們需要取10的模數,
    }//提示,如果是其他進制,只需要將10變?yōu)槠渌麛?    if(a_num[lenth_max]!=0) //因為加法最多只能進一位
        lenth_max++;
    for(int i=lenth_max-1,j=0;i>=0;i--,j++)//將結果轉移到字符串中
        res[j]=a_num[i]+'0';
    res[lenth_max]='\0';//將結果后打上終止符方便輸出
}

觀察代碼發(fā)現實際上實現高精度加法的核心在于中間的一個for循環(huán),其他全都是形同的預處理,所以我們可以想到高精度乘法的處理方式

高精度乘法

void multihigh(char a[],char b[],char res[])
{
	int lenth_a=strlen(a), lenth_b=strlen(b);
    int a_num[2005],b_num[2005],res_num[2005];

    for(int i=0;i<2005;i++)
        a_num[i]=b_num[i]=res_num[i]=0;


    for(int i=1;i<=lenth_a;i++) a_num[i]=a[lenth_a-i]-'0';
    for(int i=1;i<=lenth_b;i++) b_num[i]=b[lenth_b-i]-'0';
//-----------------------------------------------核心代碼
    for(int i=1;i<=lenth_a;i++)//通過兩重的循環(huán)實現每次數乘玩之后都要乘10
        for(int j=1;j<=lenth_b;j++)
            res_num[i+j-1]+=a_num[i]*b_num[j];//a,b的每一位相乘
            
    for(int i=1;i<lenth_a+lenth_b;i++)//十進制處理,大于10模除進位
        if(res_num[i]>=10){
            res_num[i+1]+=res_num[i]/10;
            res_num[i]%=10;
        }
    int lenth_max=lenth_a+lenth_b;//兩數相乘后,結果的位數不會比兩加數的位數之和大,方便后面找位數時降低循環(huán)次數
    
    while(res_num[lenth_max]==0&&lenth_max>1) lenth_max--;//從后找第一個非0的元素即為最高位數,從前找0不行;

//-------------------------------------------------核心代碼
    for(int i=lenth_max,j=0;i>0;i--,j++) res[j]=res_num[i]+'0';
        res[lenth_max]='\0';
}

乘法和加法基本一樣,但是高精度減法卻又多了正負的判斷。

高精度減法

首先寫a字符串>b字符串的減法函數,這樣如果a<b時只需將a,b位置顛倒;

void minHighlong(char a[],char b[],char res[])
{
    int a_num[2005],b_num[2005];
    int lenth_max=strlen(a);

    for(int i=0;i<2005;i++)
        a_num[i]=0,b_num[2005]=0;

    for(int i=strlen(a)-1,j=0;i>=0;i--,j++)
        a_num[j]=a[i]-'0';
    for(int i=strlen(b)-1,j=0;i>=0;i--,j++)
        b_num[j]=b[i]-'0';
//-----------------------------------------核心代碼
    for(int i=0;i<strlen(a);i++)
    {
        a_num[i]-=b_num[i]; //a的數組減去b的數組
        if(a_num[i]<0)  a_num[i]+=10,a_num[i+1]--;
        //如果a的該位數小于0,將取前一位數的10來填補,同時前一位減去1
    }
//-----------------------------------------核心代碼
    while(a_num[lenth_max]==0&&lenth_max>0) lenth_max--;
    for(int i=lenth_max,j=0;i>=0;i--,j++)
        res[j]=a_num[i]+'0';
    res[lenth_max+1]='\0';
}

接下來我們只需要寫個函數實現判斷a和b的大小關系,代碼如下

int compare(char a[],char b[]) 
{
	if(strlen(a)<strlen(b))//比較長度,a<b的話返回0;
		return 0;
	if(strlen(a)>strlen (b))//同理
		return 1;
	else{
		for(int i=strlen(a);i>=0;i--)//長度相同逐位數去比較,由高向低比較數字大小
			 if(a[i]<b[i])
				return 0;
	}
	return 1;
}

不能用strcmp(),strcmp() 會根據 ASCII 編碼依次比較 str1 和 str2 的每一個字符,直到出現不到的字符,或者到達字符串末尾(遇見\0)。不符合數學比大小。

最后將這兩個函數組合起來就形成了最終函數

void minHigh(char a[],char b[],char res[])
{
    if(compare(a,b))//比較后確定ab的位置
        minHighlong(a,b,res);
    else{
        minHighlong(b,a,res);//將結果加工成負數
        res[strlen(res)+1]='\0';//加休止符確定末尾
        for(int i=strlen(res);i>0;i--) res[i]=res[i-1];//從末尾向后移動一位
        res[0]='-';//加上符號
    }   
}

高精度除法

高精除低精度我們可以模擬,但是高精除高精我們只能利用高精度減法一個一個減去,最后計算出結果,同時我們的結果也可能是高精度,所以在結果的處理上我們需要用高精度加法。

void dividHigh(char a[],char b[],char res[])
{
    res[0]='0';
    res[1]='\0';
    char one[2];
    one[0]='1';
    one[1]='\0';
    while(compare(a,b))//當a<b時說明不能除了,結束
    {
        addhigh(res,one,res);//結果增加
        minHigh(a,b,a);//減去一個除數
    }
}

高精度除法用的都是之前的加減函數來實現,這樣效率特別低,所以判斷條件時能用高精除低精時,盡量用高精除低精,其中高精除低精核心代碼如下:

for(i=strlen(a)-1;i>=0;i--){ 
		reminder=reminder*10+a_num[i]; //模擬除法
		ans[i]=reminder/b;
		reminder%=b;
	}

高精度模法

高精度模低精度的話,我們只需讀一位(得乘10)模一位就可以得到最終答案,

int mod(string a, int b) {
	
    int d = 0;

	for (int i = 0; i < a.size(); i++)     
    {
		d = (d * 10 + (a[i] - '0')) % b; 
	}
	
    return d;
}

每次模之后可以將數字不斷的縮小到精度以內,但是高精度模高精度卻不可以,所以我們在處理高精模高精度時,只需將除法改下就可以了,即利用高精循環(huán)去減,判斷大小即可,這里就不贅述了

?

高精度運算就在于對每一位運算的模擬,處理好進位,拿一,相乘之后,就可實現整個運算。

?

到了這里,關于C語言 加減乘除模 的 高精度計算 (超詳細)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 加減乘除簡單嗎?不,一點都不,利用位運算實現加減乘除(代碼中不含+ - * /)

    加減乘除簡單嗎?不,一點都不,利用位運算實現加減乘除(代碼中不含+ - * /)

    這也是阿輝開的新專欄,知識將會很零散不成體系,不過絕對干貨滿滿,今天這一篇 利用位運算實現加減乘除 費了阿輝九牛二虎之力,干的很自備飲水??不多bb,進入今天的學習吧?。?! 以下int均為有符號int,所求的加減乘除也是int類型的整型數 嚴謹 ?? 在寫加減乘除之前

    2024年02月03日
    瀏覽(23)
  • bigdecimal加減乘除運算

    打印的結果如下: 打印結果如下: 打印結果如下:

    2024年02月11日
    瀏覽(20)
  • 不用加減乘除做加法

    不用加減乘除做加法

    寫一個函數,求兩個整數之和,要求在函數體內不得使用+、-、*、/四則運算符號,本題OJ鏈接 數據范圍:兩個數都滿足 ?10≤n≤1000 進階:空間復雜度 O(1),時間復雜度 O(1) 分析 :本題要求不能使用+、-、*、/,所以我們應該從二進制的角度去考慮,因為二進制的加法可以通

    2024年02月10日
    瀏覽(26)
  • 圖像四則運算(加減乘除)

    圖像四則運算(加減乘除)

    實驗目的: 1.了解圖像的算術運算在數字圖像處理中的初步應用。 2.體會圖像算術運算處理的過程和處理前后圖像的變化。 3.能夠實現簡單的圖像處理 實驗原理: 圖像的代數運算包括加,減,乘,除,這些運算的主要對象是圖像數據塊中的數據。這四種代數運算可以由如

    2024年02月08日
    瀏覽(25)
  • 只使用位運算實現加減乘除

    只使用位運算實現加減乘除

    在線OJ: LeetCode 29. 兩數相除 原題目的要求是不能使用乘法, 除法和取余運算符實現除法. 在本篇博客中把題目要求提高一點, 這里只使用位運算來實現, 順便的也就把只使用位運算實現加減乘除實現了. 首先我們需要知道兩數之和可以是兩個數位相加和不進位相加之和, 而兩數進

    2024年02月06日
    瀏覽(45)
  • Rust 復數運算,重載加減乘除運算

    Rust 復數運算,重載加減乘除運算

    復數定義 由實數部分和虛數部分所組成的數,形如a+bi 。 其中a、b為實數,i 為“虛數單位”,i2 = -1,即虛數單位的平方等于-1。 a、b分別叫做復數a+bi的實部和虛部。 當b=0時,a+bi=a 為實數; 當b≠0時,a+bi 又稱虛數; 當b≠0、a=0時,bi 稱為純虛數。 實數和虛數都是復

    2024年02月13日
    瀏覽(18)
  • Python Opencv實踐 - 圖像的加減乘除

    Python Opencv實踐 - 圖像的加減乘除

    ? ? ? ? ? ?

    2024年02月13日
    瀏覽(25)
  • Pytorch入門:Tensor加減乘除矩陣運算

    若張量維數大于2,則對最后兩維進行matmul。進行此運算的要求是張量a與b除最后兩維外的其他維必須一致:

    2024年02月12日
    瀏覽(25)
  • Java進行數字計算 BigDecimal計算(加減乘除)

    Double只能處理16位有效數精度,在某些情況下精度對其需求是不夠的,所以就有了BigDecimal。因為BigDecimal的精度范圍的范圍大,所以在問我們的開發(fā)業(yè)務中對精度要求高的屬性,就需要BigDecimal來進行存儲計算,防止精度丟失。這里我主要介紹一下BigDecimal的加,減,乘,除。四

    2023年04月08日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包