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

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

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

一、什么是高精度

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

?

?

?

二、高精度加法

? ? ? ? 說起來也覺得有些可笑,但確實(shí)如此,高精度加法我們運(yùn)用的是小學(xué)的數(shù)列式來理解。

? ? ? ? ? ? ? ? ? ?c語言高精度,數(shù)據(jù)結(jié)構(gòu)與算法,算法,c語言,藍(lán)橋杯c語言高精度,數(shù)據(jù)結(jié)構(gòu)與算法,算法,c語言,藍(lán)橋杯

? ? ? ? ?如左圖所示,我們首先將1加7得8,6加7為13,1加6為7;然后發(fā)現(xiàn)13大于10,因此要進(jìn)1。所以,7需要加1變?yōu)?。寫成代碼如上右圖所示,給大家解釋一下吧,aar1數(shù)組表示1,6,7三位數(shù);arr2數(shù)組表示6,7,1三位數(shù),值得注意的一點(diǎn)是在數(shù)組中應(yīng)倒置這樣的話便于計(jì)算;arr3數(shù)組表示的是最后的結(jié)果。第一行代碼是將1加7相加得到的結(jié)果(一會兒再解釋為啥還要加arr3),第二行代碼是將大于10的部分交于數(shù)組的下一個(gè)變量(體現(xiàn)在數(shù)學(xué)中也就是進(jìn)位);第三行代碼是得出結(jié)果(如6加7得13,經(jīng)過此步后便得到3)。由于這只是得到某一位的結(jié)果,因此循環(huán)才能得到最終的結(jié)果,上面未解釋的arr3則是為了防止可能由于前一位進(jìn)1而導(dǎo)致本身不再是0。給大家上代碼理解一下吧。

# include <stdio.h>
# include <string.h>
int main ()
{
	int max(int x,int y);


    //利用字符串形式輸入,否則數(shù)字太大,整形放不下。
	char ch1[505]="123",ch2[505]="123";
	int arr1[505]={0},arr2[505]={0},arr3[505]={0};
	scanf("%s",&ch1);scanf("%s",&ch2);
	int sz1=strlen(ch1);int sz2=strlen(ch2);



    //因?yàn)橐h(huán)相加,sz3求循環(huán)條件的,由于最后一位相可能大于10,因此先進(jìn)1
    int sz3=max(sz1,sz2)+1;




    //將字符串轉(zhuǎn)變?yōu)閿?shù)組形式存儲
	for(int i=0;i<sz1;i++)
	{
		arr1[sz1-i]=ch1[i]-'0';
	}
	for(int i=0;i<sz2;i++)
	{
		arr2[sz2-i]=ch2[i]-'0';
	}



    //高精度加法主體
	for(int i=1;i<=sz3;i++)
	{
		arr3[i]=arr3[i]+arr1[i]+arr2[i];
		arr3[i+1]=arr3[i]/10;
		arr3[i]=arr3[i]%10;
	}


    //判斷數(shù)組最后一位是否為0,不是的話減去0,并且sz3還應(yīng)大于0,否則可能什么結(jié)果也不輸出(當(dāng)輸入為0時(shí))
	if(arr3[sz3]==0&&sz3>0)   sz3--;


    輸出
	for(int i=sz3;i>0;i--)
	{
		printf("%d",arr3[i]);
	}
	return 0;
}
int max(int x,int y)
{
	int f;
	if(x>y)  f=x;
	else    f=y;
	return f;
}

?

?

?

三、高精度減法

? ? ? ? ? ? 高精度減法其實(shí)和加法差不多,不過需要注意的一點(diǎn)是應(yīng)先判斷大小,應(yīng)該用大的減小的,計(jì)算機(jī)不會算小的減大的,下圖是高精度減法主體。

c語言高精度,數(shù)據(jù)結(jié)構(gòu)與算法,算法,c語言,藍(lán)橋杯

? ? ? ? ? ? 高精度減法也是循環(huán)相減的,一位一位減。給大家解釋一下高精度減法主體的代碼吧,先判斷一下減數(shù)和被減數(shù)的大小關(guān)系,如果減數(shù)大于被減數(shù),需要進(jìn)一,也就是上一位的減數(shù)減一,而這一位加10,這就是第二三行代碼的意思,最后一行則是相減得到的數(shù),給大家上整體的代碼看看吧。

# include <stdio.h>
# include <string.h>
int main ()
{
	int compare(char a1[10090],char a2[10090],int sz1,int sz2);
	char a1[10090]="123",a2[10090]="123";
	int b1[10090]={0},b2[10090]={0},b3[10090]={0};
	scanf("%s",&a1);scanf("%s",&a2);
	int sz1=strlen(a1);
	int sz2=strlen(a2);


 
    //比較大小
	int m=compare(a1,a2,sz1,sz2);


    //判斷是否改變兩個(gè)的位置
	if(m==0)
	{
		char q[10090]="123";
		strcpy(q,a1);
		strcpy(a1,a2);
		strcpy(a2,q);
	}
	int sz3=strlen(a1);
	int sz4=strlen(a2);



    //將字符串變?yōu)閿?shù)組形式
	for(int i=0;i<sz3;i++)
	{
		b1[sz3-i]=a1[i]-'0';
	}
	for(int i=0;i<sz4;i++)
	{
		b2[sz4-i]=a2[i]-'0';
	}


    //高精度減法主體
	for(int i=1;i<=sz3;i++)
	{
		if(b1[i]<b2[i])
		{
			b1[i+1]--;
			b1[i]=b1[i]+10;
		}
		b3[i]=b1[i]-b2[i];
	} 



    //判斷是否為0
	while(b3[sz3]==0&&sz3>1)    sz3--;

    
    //判斷是否要變?yōu)樨?fù)數(shù)
	if(m==0)   printf("-");

    //輸出0
	for(int i=sz3;i>0;i--)
	{
		printf("%d",b3[i]);
	}
	return 0;
}
 
 
 
 
int compare(char a1[10090],char a2[10090],int sz1,int sz2)
{
	if(sz1>sz2)    return 1;
	else if(sz1<sz2)   return 0;
	else 
	{
		for(int i=0;i<sz1;i++)
		{
			if(a1[i]>a2[i])   return 1;
			else if(a1[i]<a2[i])    return 0;
			else   continue;
  		}
	}
}

?

?

?

四、高精度乘法

?高精度乘法的本質(zhì)也是利用小學(xué)數(shù)學(xué)的列式來解決問題? ??c語言高精度,數(shù)據(jù)結(jié)構(gòu)與算法,算法,c語言,藍(lán)橋杯? ? ??c語言高精度,數(shù)據(jù)結(jié)構(gòu)與算法,算法,c語言,藍(lán)橋杯 ? ? ? ? ? ??

?給大家解釋一下代碼吧,大家經(jīng)過高精度加法和高精度減法的代碼應(yīng)該也是對高精度了解的比較清楚了,給大家簡單介紹一下高精度乘法吧,如上左圖所示,假設(shè)a為一個(gè)數(shù)組b為一個(gè)數(shù)組,c為一個(gè)數(shù)組,通過上圖可以看出,乘法每一個(gè)相乘的結(jié)果的下標(biāo),為上面兩個(gè)的下標(biāo)之和減1;如c3中的2是a2和b2中2和2相加減1得,c4中的4是由a4和b1或者b4和c1中4和1相加減1得到的。這就是來源。下面則是我們來實(shí)現(xiàn)這個(gè)代碼,相同的是,這也是一個(gè)循環(huán)(嵌套循環(huán),大家可以看代碼),我只是把主體寫出。

# include <stdio.h>
# include <string.h>
int main ()
{
	//定義變量 
	char a1[2005]="123";
	char a2[2005]="123";
	int b1[2005]={0},b2[2005]={0},b3[2005]={0};
	scanf("%s",a1);scanf("%s",a2);
	int sz1=strlen(a1);int sz2=strlen(a2);
	
	
	//將字符串變?yōu)閿?shù)組 
	for(int i=0;i<sz1;i++)
	{
		b1[sz1-i]=a1[i]-'0';
	}
	for(int i=0;i<sz2;i++)
	{
		b2[sz2-i]=a2[i]-'0';
	}
	
	//循環(huán)條件 
	int sz3=sz1+sz2;
	 
	 
	 
	//循環(huán)主體
	for(int i=1;i<=sz1;i++)
	{
		for(int j=1;j<=sz2;j++)
		{
			b3[i+j-1]=b3[i+j-1]+b1[i]*b2[j];
			b3[i+j]=b3[i+j]+b3[i+j-1]/10;
			b3[i+j-1]=b3[i+j-1]%10;
		}
	}  



	if(b3[sz3]==0&&sz3>0)   sz3--;


    //輸出
	for(int i=sz3;i>0;i--)
	{
		printf("%d",b3[i]);
	}
	return 0;
}

?

?

?

? ?五、實(shí)例(求函數(shù)階乘和)

·c語言高精度,數(shù)據(jù)結(jié)構(gòu)與算法,算法,c語言,藍(lán)橋杯

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

?這里我用了洛谷的一道題來舉例,結(jié)合了高精度加法和高精度減法,還是比較有難度的。即使我們可以掌握高精度這個(gè)知識點(diǎn),但能AC這道題還是不容易的。先給大家上代碼再解釋吧。

?

# include <stdio.h>
int main ()
{
	int n,cnt=1;scanf("%d",&n);
	int a[10000]={0},b[10000]={0};
	for(int i=0;i<10000;i++)   a[i]=0;
	for(int i=0;i<10000;i++)   b[i]=0;
	a[1]=1;



    
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=cnt;j++)
		{
			a[j]*=i;
		}
		for(int q=1;q<=cnt;q++)
		{
			if(a[q]<10)   continue;
			int x=q;
			while(x<=cnt)
			{
				if(a[cnt]>9)   cnt++;
				a[x+1]=a[x+1]+a[x]/10;
				a[x]=a[x]%10;
				x++;
			}
		}



		for(int h=1;h<=cnt;h++)
		{
			b[h]=a[h]+b[h];
			if(b[cnt]>10) cnt++;
			b[h+1]=b[h+1]+b[h]/10;
			b[h]=b[h]%10;
		}

	}



	for(int i=cnt;i>0;i--)
	{
		printf("%d",b[i]);
	}
}

怎么說呢,這個(gè)解釋起來還是比較麻煩的,我們先輸入n,然后就進(jìn)入循環(huán)主體了,先for循環(huán)吧,將每一位數(shù)字都乘以i;然后再進(jìn)入另一個(gè)循環(huán),先判斷每一位數(shù)是否大于9,如果大,肯定要進(jìn)1,因此要進(jìn)入另一個(gè)循環(huán)。然后就是進(jìn)入一個(gè)while循環(huán),判斷最后一位是否大于9,如果大于,那么肯定要進(jìn),為防止溢出,我們就需要將數(shù)組加1,然后就是進(jìn)入高精度乘法主體,然后再進(jìn)入高精度加法主體,最后循環(huán)完輸出即可。

寫的不好,如果我有什么理解,一定會及時(shí)更改,謝謝各位的觀看。

?

?

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

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

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

相關(guān)文章

  • 【算法】模擬,高精度

    【算法】模擬,高精度

    ? P1601 A+B Problem(高精) - 洛谷 | 計(jì)算機(jī)科學(xué)教育新生態(tài) (luogu.com.cn) 思路就是模擬,值得注意的就是要用字符串類型輸入。存進(jìn)自己的int數(shù)組時(shí)要倒著存,因?yàn)槿绻钦娴脑?,進(jìn)位會有點(diǎn)trouble。 時(shí)間復(fù)雜度O(max(m,n)) ?? P1303 A*B Problem - 洛谷 | 計(jì)算機(jī)科學(xué)教育新生態(tài) (lu

    2024年02月09日
    瀏覽(85)
  • 高精度算法筆記·····························

    高精度算法筆記·····························

    加法 減法 乘法 除法 高精度加法的步驟: 1.高精度數(shù)字利用字符串讀入 2.把字符串 翻轉(zhuǎn) 存入兩個(gè)整型數(shù)組A、B 3.從低位到高位,逐位求和,進(jìn)位,存余 4.把數(shù)組C從高位到低位依次輸出 ????????1.2為準(zhǔn)備 ? ? ? ? 3為加法具體實(shí)現(xiàn)(0按位取反為-1,即-1時(shí)結(jié)束等價(jià)于=0) ?

    2024年01月21日
    瀏覽(92)
  • C++高精度算法

    目錄 前言:? 思路: 高精度加法: 高精度減法: 高精度乘法: 高精度除法: ?代碼: 一、高精度加法 二、高精度減法? 三、高精度乘法? 四、高精度除法 最后 ? ? ? ? 計(jì)算機(jī)最初、也是最重要的應(yīng)用就是數(shù)值運(yùn)算。在編程進(jìn)行數(shù)值運(yùn)算時(shí),有時(shí)會遇到運(yùn)算的精度要求特

    2024年02月14日
    瀏覽(96)
  • 高精度減法(C語言實(shí)現(xiàn))

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

    2024年02月05日
    瀏覽(21)
  • C++基礎(chǔ)算法高精度篇

    C++基礎(chǔ)算法高精度篇

    ??作者主頁:慢熱的陜西人 ??專欄鏈接:C++算法 ??歡迎各位大佬??點(diǎn)贊??關(guān)注??收藏,??留言 主要講解了高精度算法的四種常用的計(jì)算 以下數(shù)字均指位數(shù) ①A + B(精度均在10^6) ②A - B (精度均在10^6) ③A * b (len(A) = 10^6, a = 1000); ④A / b (len(A) = 10^6, a = 1000); Ⅲ. Ⅰ . A

    2024年02月16日
    瀏覽(27)
  • C++ 算法 高精度(較詳細(xì).)

    C++ 算法 高精度(較詳細(xì).)

    ????????在我們進(jìn)行計(jì)算的過程中,經(jīng)常會遇到 幾十位,甚至幾百位的數(shù)字 的計(jì)算問題,也有可能會遇到小數(shù)點(diǎn)后幾十位,幾百位的情況,而我們面對這樣的情況下,?? 和 的數(shù)據(jù)范圍顯然是 不夠使用 的了。因此這時(shí),我們就需要引入一個(gè)新的算法,叫做 高精度算法

    2023年04月10日
    瀏覽(19)
  • 高精度加法,減法,乘法,除法(上)(C語言)

    高精度加法,減法,乘法,除法(上)(C語言)

    前言 本篇內(nèi)容介紹加法和減法,如果想看乘法和除法就點(diǎn)這里-高精度乘法,除法 加,減,乘,除這些運(yùn)算我們自然信手捏來,就拿加法來說,我們要用c語言編程算a+b的和,只需讓sum = a+b即可,可是這是局限的,我們都知道int的表示的最大值為2147483647(32位和64位機(jī)器)。但

    2024年02月03日
    瀏覽(22)
  • 高精度加法,減法,乘法,除法(下)(C語言)

    高精度加法,減法,乘法,除法(下)(C語言)

    前言 上一篇博客我們分享了高精度加法,減法,這一期我將為大家講解高精度乘法和高精度除法。那讓我們開始吧! 對加法和減法感興趣的話就點(diǎn)我 讓我們想想我們平時(shí)做數(shù)學(xué)時(shí)遇見乘法是怎么做的。以下圖為例。 高精度乘法也是這樣的一個(gè)思路,首先我們先把a(bǔ)和b的值儲存

    2024年02月04日
    瀏覽(95)
  • 基于matlab的高精度信號峰值檢測算法

    基于matlab的高精度信號峰值檢測算法

    目錄 1.算法描述 2.仿真效果預(yù)覽 3.MATLAB核心程序 4.完整MATLAB ? ? ? ?峰值檢驗(yàn)是示波表中數(shù)據(jù)采集方式之一, 這種技術(shù)起源于存儲深度不能滿足捕獲毛刺的需要。如果用模擬示波器去觀察, 只有當(dāng)毛刺信號是重復(fù)性的并且和主信號同步時(shí), 才能看到毛刺信號?。由于毛刺源于其

    2024年02月12日
    瀏覽(89)
  • 洛谷題單算法1-1模擬與高精度

    發(fā)文章只是為了督促自己做題,雙非大二剛轉(zhuǎn)科班的菜菜一枚,代碼僅供參考,不足之處望理解。 ????????這題太惡心了,看完題解發(fā)現(xiàn)三種情況沒有考慮,后來給補(bǔ)上了,我的 if-else 思路可能寫的不太好,但是能過 ? ? ? ? 注意結(jié)構(gòu)體在函數(shù)中的傳參(下學(xué)期c語言II要好

    2024年02月19日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包