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

高精度減法(C語(yǔ)言實(shí)現(xiàn))

這篇具有很好參考價(jià)值的文章主要介紹了高精度減法(C語(yǔ)言實(shí)現(xiàn))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

高精度減法(C語(yǔ)言實(shí)現(xiàn))

介紹

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

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

書接上回,我們今天繼續(xù)講解高精度減法的C語(yǔ)言實(shí)現(xiàn):


代碼實(shí)現(xiàn)

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

int cmp(int a[], int b[], int len1, int len2)
{//大小比較函數(shù)
	if (len1 > len2)//先對(duì)比長(zhǎng)度
		return 0;
	else if (len1 < len2)//長(zhǎng)度不一樣直接返回結(jié)果
		return 1;
	else//長(zhǎng)度一致則依次比較每一位大小
	{
		for (int i = len1 - 1; i >= 0; i--)
		{
			if (a[i] > b[i])
				return 0;
			if (a[i] < b[i])
				return 1;
		}
	}
	return 0;//如果完全一致則返回0,避免減法函數(shù)中調(diào)用導(dǎo)致無(wú)限遞歸
}

int minus(int a[], int b[], int c[], int len1, int len2)
{//高精度減法函數(shù)
	if (cmp(a, b, len1, len2))//減法函數(shù)只計(jì)算大減小,小減大則反過(guò)來(lái),然后輸出時(shí)加負(fù)號(hào)
		return minus(b, a, c, len2, len1);
	int t = 0;//t標(biāo)識(shí)是否借位
	for (int i = 0; i < len1; i++)
	{
		c[i] = (a[i] - b[i] + t + 10) % 10;//c[i]表示這一位運(yùn)算結(jié)果
		if (a[i] - b[i] + t < 0) t = -1;//計(jì)算是否借位
		else t = 0;
	}
	int len3 = len1;
	while (c[len3 - 1] == 0)//去除前導(dǎo)0,返回結(jié)果的位數(shù)
	{
		if (len3 == 1) return len3;
		len3--;
	}
	return len3;
}

int main()
{
	char str1[N], str2[N];//----------------------------
	int a[N] = { 0 }, b[N] = { 0 }, c[N] = { 0 };
	char x;
	int len1 = 0, len2 = 0;
	do
	{
		scanf("%c", &x);
		str1[len1++] = x;

	} while (x != '\n');
	do//                                數(shù)據(jù)讀入部分不作贅述
	{
		scanf("%c", &x);
		str2[len2++] = x;

	} while (x != '\n');
	len1--; len2--;
	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';//---------------
	int len3 = minus(a, b, c, len1, len2);//執(zhí)行高精度減法函數(shù)
	if (cmp(a, b, len1, len2))//大小比較函數(shù)
		printf("-");//結(jié)果為負(fù)數(shù)則打個(gè)負(fù)號(hào)先
	for (int i = len3 - 1; i >= 0; i--)
		printf("%d", c[i]);
	return 0;
}

思路解析

鑒于在高精度加法一篇中我們已經(jīng)講解過(guò)了數(shù)據(jù)的讀入,所以我們這一篇不再贅述,沒(méi)看過(guò)上一篇的可以點(diǎn)擊下方鏈接:

高精度加法(C語(yǔ)言實(shí)現(xiàn)) - 涼茶coltea


高精度減法思路和高精度加法基本一致,區(qū)別就是加法考慮進(jìn)位,減法考慮退位,以及減法的結(jié)果的位數(shù)變動(dòng)是極大的。

我們對(duì)每一位分別計(jì)算,得出結(jié)果,存入新數(shù)組c,同時(shí)用臨時(shí)變量t來(lái)標(biāo)識(shí)是否借位。

但小數(shù)減大數(shù)的結(jié)果是負(fù)數(shù),在實(shí)際操作中十分不便,所以我們另外聲明一個(gè)cmp函數(shù)來(lái)比較二者大小,如果被減數(shù)比較小,那我們就可以用減數(shù)減去被減數(shù),輸出結(jié)果前先輸出一個(gè)負(fù)號(hào),達(dá)到同樣的效果。


數(shù)據(jù)的讀入上,高精度加減乘除基本一模一樣,所以我們直接跳到第一個(gè)關(guān)鍵部分,大小比較函數(shù):

int cmp(int a[], int b[], int len1, int len2)
{//大小比較函數(shù)
	if (len1 > len2)//先對(duì)比長(zhǎng)度
		return 0;
	else if (len1 < len2)//長(zhǎng)度不一樣直接返回結(jié)果
		return 1;
	else//長(zhǎng)度一致則依次比較每一位大小
	{
		for (int i = len1 - 1; i >= 0; i--)
		{
			if (a[i] > b[i])
				return 0;
			if (a[i] < b[i])
				return 1;
		}
	}
	return 0;//如果完全一致則返回0,避免減法函數(shù)中調(diào)用導(dǎo)致無(wú)限遞歸
}

在數(shù)據(jù)的讀入中,我們已經(jīng)知道了兩數(shù)的位數(shù),那就可以通過(guò)比較位數(shù)來(lái)判斷二者大小誰(shuí)長(zhǎng)誰(shuí)大。

倘若二者長(zhǎng)度一致,那就依次比較每一位的大小,也就是比較二者的字典序。

倘若二者完全一致,那我們返回0,原因后面說(shuō)。


有了大小比較函數(shù),我們就可以保證計(jì)算時(shí)是大數(shù)減去小數(shù)了,這樣,我們就規(guī)避了負(fù)數(shù)的困擾,可以更輕松地實(shí)現(xiàn)高精度減法的函數(shù):

int minus(int a[], int b[], int c[], int len1, int len2)
{//高精度減法函數(shù)
	if (cmp(a, b, len1, len2))//減法函數(shù)只計(jì)算大減小,小減大則反過(guò)來(lái),然后輸出時(shí)加負(fù)號(hào)
		return minus(b, a, c, len2, len1);
	int t = 0;//t標(biāo)識(shí)是否借位
	for (int i = 0; i < len1; i++)
	{
		c[i] = (a[i] - b[i] + t + 10) % 10;//c[i]表示這一位運(yùn)算結(jié)果
		if (a[i] - b[i] + t < 0) t = -1;//計(jì)算是否借位
		else t = 0;
	}
	int len3 = len1;
	while (c[len3 - 1] == 0)//去除前導(dǎo)0,返回結(jié)果的位數(shù)
	{
		if (len3 == 1) return len3;
		len3--;
	}
	return len3;
}

如你所見,第一步就是對(duì)二者大小的判斷,如果被減數(shù)比減數(shù)小,我們直接改變?nèi)雲(yún)⒌捻樞騺?lái)改變二者位置。

倘若二者完全一致時(shí)cmp返回1,那么再調(diào)換位置后,minus函數(shù)將繼續(xù)調(diào)用cmp函數(shù)來(lái)判斷二者大小,每次都會(huì)返回1,導(dǎo)致無(wú)限遞歸,這就是我們規(guī)定完全一致時(shí)返回0的原因。

其中我們用c[i] = (a[i] - b[i] + t + 10) % 10;來(lái)計(jì)算結(jié)果的第i位,之所以要+10,是模擬結(jié)果為負(fù)時(shí)向前一位借10的過(guò)程,而如果(a[i] - b[i] + t)不為負(fù)數(shù),那因?yàn)?code>%10的存在,也不會(huì)產(chǎn)生影響。

下一行if (a[i] - b[i] + t < 0)也很好理解,若是(a[i] - b[i] + t)為負(fù)數(shù),那就需要向前一位借位,那我們就標(biāo)記t=-1,來(lái)影響下一位的結(jié)果計(jì)算即可。

最后我們需要去除前導(dǎo)0,首先因?yàn)檫\(yùn)算數(shù)都是正整數(shù),所以結(jié)果最大位數(shù)也就和被減數(shù)一樣,所以我們從被減數(shù)的最高位數(shù)開始判斷結(jié)果c,如果為0,那就把返回的長(zhǎng)度len3減去1,而值得注意的是,若是結(jié)果只有1位了那就不能減了,因?yàn)檫@意味著結(jié)果為0。


那此時(shí)我們就已經(jīng)完成了高精度減法的運(yùn)算,將結(jié)果存入了數(shù)組c,但別忘了結(jié)果正負(fù)的判斷:

	if (cmp(a, b, len1, len2))//大小比較函數(shù)
		printf("-");//結(jié)果為負(fù)數(shù)則打個(gè)負(fù)號(hào)先

如果被減數(shù)比減數(shù)小,我們需要提前把負(fù)號(hào)補(bǔ)上。

那就此,大功告成。


結(jié)尾

那么以上便是對(duì)高精度減法算法的介紹,本文由涼茶coltea撰寫,思路來(lái)自AcWing,大佬yxc的課程。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-742562.html

到了這里,關(guān)于高精度減法(C語(yǔ)言實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 高精度減法

    要實(shí)現(xiàn)兩個(gè)高精度數(shù)的減法,和高精度加法一樣都是模擬豎式計(jì)算的過(guò)程,主要就是解決以下兩個(gè)問(wèn)題。 誰(shuí)大誰(shuí)??? 由于這兩個(gè)數(shù)字都很大,但是不知道誰(shuí)更大,所以要先判斷哪個(gè)數(shù)更大,思路如下: 判斷這兩個(gè)數(shù)誰(shuí)的位數(shù)更大,位數(shù)更大的自然更大。 如果位數(shù)不相同,從

    2024年02月08日
    瀏覽(98)
  • C++基礎(chǔ)算法①——高精度加減法計(jì)算

    C++基礎(chǔ)算法①——高精度加減法計(jì)算

    當(dāng)我們利用計(jì)算機(jī)進(jìn)行數(shù)值計(jì)算,有時(shí)候會(huì)遇到這樣的問(wèn)題: n!的精確結(jié)果是多少? 當(dāng)n小于30的時(shí)候,我們當(dāng)然可以通過(guò)電腦自帶的計(jì)算器計(jì)算出來(lái)。但是當(dāng)我們遇到 100! 的時(shí)候就沒(méi)有辦法直接計(jì)算出精確的結(jié)果。再比如,求兩個(gè)20000位的數(shù)的和。 那怎么解決精度缺失的問(wèn)

    2024年02月16日
    瀏覽(21)
  • 算法之高精度(含實(shí)例與詳解)C語(yǔ)言

    算法之高精度(含實(shí)例與詳解)C語(yǔ)言

    ? ? ? ?高精度本質(zhì)上是一種計(jì)算,由于int型和long long型的存儲(chǔ)的數(shù)據(jù)大小有限。在有符號(hào)定義的情況下,int型為2的31次方減1;在無(wú)符號(hào)定義的情況下,lint型為2的32次方。因此過(guò)于巨大的數(shù)無(wú)法展示,這就用到了高精度來(lái)計(jì)算,其原理為將很大的數(shù)一位一位存在數(shù)組中,最后

    2024年02月06日
    瀏覽(18)
  • 免費(fèi)開源的高精度OCR文本提取,支持 100 多種語(yǔ)言、自動(dòng)文本定位和腳本檢測(cè),幾行代碼即可實(shí)現(xiàn)離線使用(附源碼)

    免費(fèi)開源的高精度OCR文本提取,支持 100 多種語(yǔ)言、自動(dòng)文本定位和腳本檢測(cè),幾行代碼即可實(shí)現(xiàn)離線使用(附源碼)

    免費(fèi)開源的高精度OCR文本提取,支持 100 多種語(yǔ)言、自動(dòng)文本定位和腳本檢測(cè),幾行代碼即可實(shí)現(xiàn)離線使用(附源碼)。 要從圖像、照片中提取文本嗎?是否剛剛拍了講義的照片并想將其轉(zhuǎn)換為文本?那么您將需要一個(gè)可以通過(guò) OCR(光學(xué)字符識(shí)別)識(shí)別文本的應(yīng)用程序。 圖

    2024年02月01日
    瀏覽(101)
  • C語(yǔ)言 加減乘除模 的 高精度計(jì)算 (超詳細(xì))

    目錄 高精度加法 高精度乘法 高精度減法 ? ? ? ? ?高精度除法 高精度模法 ? 高精度計(jì)算 是模擬算法的一種,通過(guò)字符串和整型數(shù)組的使用,將加減乘除的豎式運(yùn)算 模擬 出來(lái),達(dá)到計(jì)算的目的。其步驟大致分為:一,將字符串?dāng)?shù)據(jù)存到整型數(shù)組中,二,模擬算法,不同的

    2023年04月24日
    瀏覽(17)
  • 高精度除法【c++實(shí)現(xiàn)】超詳細(xì)講解

    高精度算法分為兩種,高精除以低精和高精除以高精。不要看都是除法,就認(rèn)為原理類似,其實(shí)是有很大差距的。讓我們一起來(lái)學(xué)習(xí)吧! 有句話說(shuō)在前面,如果除數(shù)等于0,就不要算了,不成立。( 如果你忘了這個(gè)知識(shí),小學(xué)數(shù)學(xué)老師饒不了你 ) 高精度除低精度,原理是模

    2024年02月13日
    瀏覽(92)
  • STM32 SYSTick高精度延時(shí)功能代碼實(shí)現(xiàn)

    STM32 SYSTick高精度延時(shí)功能代碼實(shí)現(xiàn)

    本篇文章將給大家講解一下SYSTICK滴答定時(shí)器,以及講解使用滴答定時(shí)器來(lái)實(shí)現(xiàn)高精度延時(shí)功能的代碼。 SysTick定時(shí)器是嵌入式系統(tǒng)中常見的一個(gè)系統(tǒng)定時(shí)器,在ARM Cortex-M微控制器中廣泛使用。下面是關(guān)于SysTick定時(shí)器的一些介紹: 用途: SysTick定時(shí)器通常被用作操作系統(tǒng)的時(shí)鐘

    2024年02月22日
    瀏覽(92)
  • Flutter實(shí)現(xiàn)PS鋼筆工具,實(shí)現(xiàn)高精度摳圖的效果。

    Flutter實(shí)現(xiàn)PS鋼筆工具,實(shí)現(xiàn)高精度摳圖的效果。

    演示: ?代碼: stack代碼: 主要思路: 更具手指點(diǎn)擊屏幕的位置,記錄點(diǎn)擊的位置,并生成繪制點(diǎn)和兩個(gè)控制點(diǎn),手指拖動(dòng)控制點(diǎn)時(shí),動(dòng)態(tài)刷新控制點(diǎn)位置,然后利用flutter繪制機(jī)制,在canvas上根據(jù)點(diǎn)的位置和控制點(diǎn)的位置繪制三階貝塞爾曲線,實(shí)現(xiàn)鋼筆工具效果。具體實(shí)現(xiàn)

    2024年02月07日
    瀏覽(14)
  • AI模型大殺器----Amazon SageMaker 實(shí)現(xiàn)高精度貓狗分類

    AI模型大殺器----Amazon SageMaker 實(shí)現(xiàn)高精度貓狗分類

    前言: Hello大家好,我是Dream。 最近受邀參與了 亞馬遜云科技【云上探索實(shí)驗(yàn)室】 活動(dòng),基于他們的sagemaker實(shí)現(xiàn)了機(jī)器學(xué)習(xí)中一個(gè)非常經(jīng)典的案例: 貓狗分類 。最讓我驚喜的是的模型訓(xùn)速度比想象中 效果要好得多,而且速度十分迅速,而且總體感覺下來(lái)整個(gè)過(guò)程十分便利

    2023年04月09日
    瀏覽(20)
  • C語(yǔ)言/C++隨機(jī)數(shù)生成,程序運(yùn)行時(shí)間計(jì)時(shí)器(含高精度計(jì)時(shí)器),包括Windows環(huán)境與Linux環(huán)境

    C語(yǔ)言/C++隨機(jī)數(shù)生成,程序運(yùn)行時(shí)間計(jì)時(shí)器(含高精度計(jì)時(shí)器),包括Windows環(huán)境與Linux環(huán)境

    ? ??【數(shù)據(jù)結(jié)構(gòu)與算法】專題正在持續(xù)更新中,各種數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建原理與運(yùn)用?,經(jīng)典算法的解析?都在這兒,歡迎大家前往訂閱本專題,獲取更多詳細(xì)信息哦?????? ??本系列專欄 - ?數(shù)據(jù)結(jié)構(gòu)與算法_勾欄聽曲_0 ??歡迎大家 ??? ?點(diǎn)贊?? ?評(píng)論?? ?收藏?? ??個(gè)人

    2023年04月26日
    瀏覽(19)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包