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

C語言實現(xiàn)高精度減法

 更新時間:2023年11月05日 09:45:57   作者:涼茶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)最終的運算效果。

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

代碼實現(xiàn)

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

int cmp(int a[], int b[], int len1, int len2)
{//大小比較函數(shù)
	if (len1 > len2)//先對比長度
		return 0;
	else if (len1 < len2)//長度不一樣直接返回結(jié)果
		return 1;
	else//長度一致則依次比較每一位大小
	{
		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)致無限遞歸
}

int minus(int a[], int b[], int c[], int len1, int len2)
{//高精度減法函數(shù)
	if (cmp(a, b, len1, len2))//減法函數(shù)只計算大減小,小減大則反過來,然后輸出時加負號
		return minus(b, a, c, len2, len1);
	int t = 0;//t標識是否借位
	for (int i = 0; i < len1; i++)
	{
		c[i] = (a[i] - b[i] + t + 10) % 10;//c[i]表示這一位運算結(jié)果
		if (a[i] - b[i] + t < 0) t = -1;//計算是否借位
		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é)果為負數(shù)則打個負號先
	for (int i = len3 - 1; i >= 0; i--)
		printf("%d", c[i]);
	return 0;
}

思路解析

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

C語言實現(xiàn)高精度加法

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

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

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

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

int cmp(int a[], int b[], int len1, int len2)
{//大小比較函數(shù)
	if (len1 > len2)//先對比長度
		return 0;
	else if (len1 < len2)//長度不一樣直接返回結(jié)果
		return 1;
	else//長度一致則依次比較每一位大小
	{
		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)致無限遞歸
}

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

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

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

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

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

如你所見,第一步就是對二者大小的判斷,如果被減數(shù)比減數(shù)小,我們直接改變?nèi)雲(yún)⒌捻樞騺砀淖兌呶恢谩?/p>

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

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

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

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

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

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

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

那就此,大功告成。

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

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼

    C語言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼

    這篇文章主要為大家詳細介紹了C語言數(shù)據(jù)結(jié)構(gòu)之堆排序源代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 詳解C++ 動態(tài)內(nèi)存分配與命名空間

    詳解C++ 動態(tài)內(nèi)存分配與命名空間

    這篇文章主要介紹了詳解C++ 動態(tài)內(nèi)存分配與命名空間,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • C語言實現(xiàn)漢諾塔游戲

    C語言實現(xiàn)漢諾塔游戲

    個人覺得漢諾塔這個遞歸算法比電子老鼠的難了一些,不過一旦理解了也還是可以的,其實網(wǎng)上也有很多代碼,可以直接參考。記得大一開始時就做過漢諾塔的習(xí)題,但是那時代碼寫得很長很長,也是不理解遞歸的結(jié)果。今天重新來實現(xiàn)一下
    2015-03-03
  • C語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)串(堆分配存儲表示法)實例詳解

    C語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)串(堆分配存儲表示法)實例詳解

    這篇文章主要介紹了C語言實現(xiàn)數(shù)據(jù)結(jié)構(gòu)串(堆分配存儲表示法)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++ 虛函數(shù)實戰(zhàn)示例詳解

    C++ 虛函數(shù)實戰(zhàn)示例詳解

    C++抽象基類cap_ops定義設(shè)備操作接口,支持多態(tài),統(tǒng)一管理攝像頭、傳感器等設(shè)備,包含線程控制與資源管理方法,建議使用智能指針和日志,便于擴展和維護,本文給大家介紹C++ 虛函數(shù)實戰(zhàn),感興趣的朋友一起看看吧
    2025-07-07
  • Visual Studio Code 從簡介、安裝到配置所需插件詳細介紹

    Visual Studio Code 從簡介、安裝到配置所需插件詳細介紹

    這篇文章給大家介紹到vs與vs code的區(qū)別,并且會詳細介紹vscode的安裝步驟,和我所了解過的插件配置,感興趣的朋友跟隨小編一起看看吧
    2020-03-03
  • C語言qsort函數(shù)用冒泡排序?qū)崿F(xiàn)過程詳解

    C語言qsort函數(shù)用冒泡排序?qū)崿F(xiàn)過程詳解

    qsort函數(shù)是由C語言提供的標準庫函數(shù), 它的實現(xiàn)思想是快速排序。這篇文章主要介紹了C語言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)qsort函數(shù)功能,需要的可以參考一下
    2023-02-02
  • OpenCV識別圖像上的線條軌跡

    OpenCV識別圖像上的線條軌跡

    這篇文章主要為大家詳細介紹了OpenCV識別圖像上的線條軌跡,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • memset函數(shù)的使用分析

    memset函數(shù)的使用分析

    本篇文章是對memset函數(shù)的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言運用函數(shù)的遞歸實現(xiàn)漢諾塔

    C語言運用函數(shù)的遞歸實現(xiàn)漢諾塔

    遞歸(recursive)函數(shù)是“自己調(diào)用自己”的函數(shù),無論是采用直接或間接調(diào)用方式。間接遞歸意味著函數(shù)調(diào)用另一個函數(shù)(然后可能又調(diào)用第三個函數(shù)等),最后又調(diào)用第一個函數(shù)。因為函數(shù)不可以一直不停地調(diào)用自己,所以遞歸函數(shù)一定具備結(jié)束條件
    2022-07-07

最新評論

永康市| 万宁市| 邵武市| 咸丰县| 宝应县| 区。| 托里县| 遂宁市| 广德县| 黑水县| 昌黎县| 定远县| 额敏县| 宁陵县| 弥勒县| 平罗县| 宁河县| 卢龙县| 辽中县| 固镇县| 崇明县| 磐安县| 亳州市| 江陵县| 天水市| 彩票| 报价| 望江县| 涞源县| 襄垣县| 拜城县| 北安市| 噶尔县| 西青区| 临武县| 昆明市| 靖安县| 秦安县| 黄石市| 定日县| 郁南县|