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

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

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

????????????????概念 ??????

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

???????? 我們可以利用程序設(shè)計(jì)的方法去實(shí)現(xiàn)這樣的高精度計(jì)算 . 介紹常用的幾種高精度計(jì)算的方法 .

思想

????????高精度算法本質(zhì)上是用字符串模擬數(shù)字進(jìn)行計(jì)算,再利用類似于數(shù)學(xué)里的豎式的形式,一位一位進(jìn)行相關(guān)計(jì)算 .

處理

高精度計(jì)算中需要處理好以下幾個(gè)問(wèn)題:

1)數(shù)據(jù)的接收方法和存儲(chǔ)方法

??????? 數(shù)據(jù)的接收和存儲(chǔ):當(dāng)輸入的數(shù)很長(zhǎng)時(shí),可采用字符串方式輸入,這樣可輸入位數(shù)很長(zhǎng)的數(shù),利用字符串函數(shù)和操作運(yùn)算,將每一位取出,存入數(shù)組中 .

void init(int a[]) { // 傳入數(shù)組
    string s;
    cin >> s; 
    len = s.length(); // s.length --> 計(jì)算字符串位數(shù)
    for(int i=1; i<=len; i++)     
        a[i] = s[len -i] - '0'; //將字符串s轉(zhuǎn)換為數(shù)組a, 倒序存儲(chǔ)
}

2)進(jìn)位、借位的處理.

// 加法進(jìn)位: c[i] = a[i] + b[i]

code:    if(c[i] >= 10) {
            c[i] %= 10;
            ++c[i++];
         }

//減法借位: c[i] = a[i] - b[i]

code:    if(a[i] < b[i]) {
             --a[i+1];
             a[i] += 10;   
         } 

//乘法進(jìn)位: c[i + j - 1] = a[i] * b[j] + x + c[i + j - 1];
          x = c[i + j - 1] / 10;
          c[i + j - 1] % 10;

高精度加法 +

????????輸入兩個(gè)數(shù)到變量中,然后用賦值語(yǔ)句求它們的和后輸出 . But,我們知道,在 C++ 語(yǔ)言中任何數(shù)據(jù)類型都有一定表示范圍. 當(dāng)兩個(gè)加數(shù)很大時(shí),以前的算法顯然不能求出精確解,因此我們需要尋求另一種方法 .在讀小學(xué)時(shí),我們做加法都采用豎式方法 . 這樣我們方便寫出兩個(gè)整數(shù)相加的算法 .

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

??????? 如果我們用數(shù)組分別儲(chǔ)存兩個(gè)加數(shù),用數(shù)組 儲(chǔ)存結(jié)果。則上例有 :

#include <cstdio>
#include <cstring>

using namespace std;

int main() {
    char a1[5005], b1[5005]; //用字符存儲(chǔ)數(shù)字
    int a[5005], b[5005], c[5005]; //c[i] 用來(lái)儲(chǔ)存每位相加的結(jié)果
    int len_a, len_b, len_c = 1, x, i;

    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));

    scanf("%s%s", a1, b1); //輸入兩個(gè)加數(shù)

    len_a = strlen(a1);
    len_b = strlen(b1);

    for(i=0; i<len_a; i++) a[len_a - i] = a1[i] - '0'; // 將加數(shù)放進(jìn)a數(shù)組
    for(i=0; i<len_b; i++) b[len_b - i] = b1[i] - '0'; // 將另一個(gè)加數(shù)放進(jìn)b數(shù)組

    x = 0; // x為進(jìn)位
    while(len_c <= len_a || len_c <= len_b) {
        c[len_c] = a[len_c] + b[len_c] + x; // 兩數(shù)相加,再加上前兩個(gè)數(shù)進(jìn)位的
        x = c[len_c] / 10; // 刷新進(jìn)位
        c[len_c] %= 10; // 進(jìn)位后剩下的
        len_c++; //位數(shù)加1
    }
    c[len_c] = x;
    if(c[len_c] == 0) { //判斷首位是否為0
        len_c--; // 不輸出此位
    }

    for(int i=len_c; i>=1; i--) {
        printf("%d", c[i]); //輸出每一位的數(shù)
    }

    return 0;
}

高精度減法 -

??????? 類似加法,同樣使用豎式。在做減法運(yùn)算時(shí),需要注意的是:需要有借位處理。

#include <iostream>
#include <cstring>

int main() {
    int a[5005], b[5005], c[5005];
    int lena, lenb, lenc, i;
    char n[5005], n1[5005], n2[5005];

    std::memset(a, 0, sizeof(a));
    std::memset(b, 0, sizeof(b));
    std::memset(c, 0, sizeof(c));

    std::cin >> n1 >> n2; //輸入被減數(shù)和減數(shù)

    lena = std::strlen(n1);
    lenb = std::strlen(n2);

    for(i=0; i<lena; i++) a[lena - i] = (int)n1[i] - '0';
    for(i=0; i<lenb; i++) b[lenb - i] = (int)n2[i] - '0'; //逆序存放排列

    i = 1;
    while(i <= lena || i <= lenb) {
        if(a[i] < b[i]) {
            c[i] = a[i] + 10 - b[i];
            a[i+1]--; //借位處理
        }
        else {
            c[i] = a[i] - b[i]; 
        }
        i++;
    }

    lenc = i;
    while(c[lenc] == 0 && lenc > 1) { //如果最后一位是0,是需要輸出的
        lenc--;   // 不輸出首位0
    }

    for(i=lenc; i>=1; i--) std::cout << c[i];

    return 0;
}

高精度乘法 ×

??????? 類似加法,使用豎式。在做乘法時(shí),同樣也有進(jìn)位。C++ 算法 高精度(較詳細(xì).)

??????? 分析 數(shù)組的下標(biāo)變化規(guī)律,可以寫出以下關(guān)系式:????????? C++ 算法 高精度(較詳細(xì).)

?????? 由此可見(jiàn), 跟 乘積有關(guān),跟上次的進(jìn)位有關(guān),跟還原 的值有關(guān),分析下標(biāo)規(guī)律,有 :

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

#include <iostream>
#include <cstring>

int main() {
	int a[105], b[105], c[10005];
	char n1[105], n2[105], lena, lenb, lenc, j, i, x;

	std::memset(a, 0, sizeof(a));
	std::memset(b, 0, sizeof(b));
	std::memset(c, 0, sizeof(c));
	
	std::cin >> n1 >> n2;
	
	lena = std::strlen(n1);
	lenb = std::strlen(n2);
	
	for(i=0; i<=lena-1; i++) a[lena - i] = n1[i] - 48; 
	for(i=0; i<=lenb-1; i++) b[lenb - i] = n2[i] - 48; // 倒序儲(chǔ)存
	
	for(i=1; i<=lena; i++) {
		x = 0;
		for(j=1; j<=lenb; j++) {
			c[i + j - 1] = c[i + j - 1] + x + a[i] * b[j];
			x = c[i + j - 1] / 10; // 進(jìn)位
			c[i + j - 1] %= 10; // 剩余
		}
		c[i + lenb] = x; // 進(jìn)位的數(shù)
	}
	
	lenc = lena + lenb;
	while(c[lenc] == 0 && lenc > 1) {
		lenc--; // 刪除前導(dǎo)0
	}
	
	for(i=lenc; i>=1; i--) {
		std::cout << c[i];
	}  // 輸出每一位
	   
    std::cout << std::endl;
	
	return 0;
} 

除法 ÷

1)高精除以低精

??????? 做除法時(shí),每一次的商值都在 0~9 之間,每次求得的余數(shù)連接以后的若干位得到新的被除數(shù),繼續(xù)做除法。因此,在做高精度除法時(shí),要涉及到乘法運(yùn)算和減法運(yùn)算,還有移位處理。當(dāng)然,為了程序簡(jiǎn)潔,可以避免高精度乘法,用 0~9 次循環(huán)減法取代得到商的值。采用按位相除法

#include <iostream>

int main(){
    char n1[100];
    int a[100], c[100], lena, i, x = 0, lenc, b;
    
    std::memset(a, 0, sizeof(a));
    std::memset(c, 0, sizeof(c));
    
    std::cin >> n1 >> b;  
    lena = strlen(n1);

    for(i=1; i<=lena; i++) {
        a[i] = n1[i - 1] - '0'; //除法不需要逆序存放
    }

//-------------------------初始化------------------------------

    for(i=1; i<=lena; i++) {
        c[i] = (a[i] + x * 10) / b;  // 算上上一位剩下的繼續(xù)除
        x = (a[i] + 10 * x) % b; // 求余
    }

    lenc = 1;
    while(c[lenc] == 0 && lenc < lena) {
        lenc++;
    }

    for(i=lenc; i<lena; i++) std::cout << c[i];

    return 0;
}

2)高精除以高精

??????? 高精除以低精是對(duì)被除數(shù)的每一位(這里的"一位"包含前面的余數(shù),以下都是如此)都除以除數(shù),而高精除以高精則使用減法模擬除法,對(duì)被除數(shù)的每一位都減去除數(shù),一直減到當(dāng)前位置的數(shù)字(包含前面的余數(shù))小于除數(shù)(由于每一位的數(shù)字小于10,所以對(duì)每一位最多進(jìn)行10次運(yùn)算),代碼如下:

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

int a[50005], b[50005], c[50005], d;

void init(int a[]) {
	char s[50005];
	cin >> s;
	a[0] = strlen(s);		// 字符串存儲(chǔ),表示位數(shù)	
	for (int i=1; i<=a[0]; i++) {
		a[i] = s[a[0]-i] - 48;	// 正序儲(chǔ)存
	} 	
}

void print(int a[]) {			
	if (a[0] == 0) {
		cout << 0 << endl;
		return;  // 位數(shù)為0,輸出0
	}
	for (int i=a[0]; i>=1; i--) {
		cout << a[i];  // 輸出函數(shù)
	}
	cout << endl;
	return;
} 

int compare(int a[], int b[]) {	
	if (a[0] > b[0]) {
		return 1; // 被減數(shù)大于減數(shù)
	} 
	if (a[0] < b[0]) {
		return -1; // 被減數(shù)小于減數(shù)
	}
	for (int i=a[0]; i>=1; i--) {	
		if (a[i] > b[i]) {
			return 1;
		} 
		if (a[i] < b[i]) {
			return -1;
		}   // 位數(shù)相同,找到第一位不同的進(jìn)行比較
	} 
	return 0;					
}

void numcpy(int p[], int q[], int det) {
	for (int i=1; i<=p[0]; i++) {
		q[i+det-1] = p[i]; //復(fù)制p數(shù)組到q數(shù)組從det開(kāi)始的地方
	}
	q[0] = p[0] + det - 1;
}

void jian(int a[], int b[]) {		
	int flag = compare(a, b);		 
	if (flag == 0)  {					
		a[0] = 0;
		return;
	}
	if (flag == 1) {				
		for (int i=1; i<=a[0]; i++) {
			if (a[i] < b[i]) {			 
				a[i+1]--;			
				a[i] += 10;
			}
			a[i] -= b[i];
		}
		while (a[0]>0 && a[a[0]]==0) {
			a[0]--;					
		} 
		return; 
	}				 
}  // 高精減法

void chugao(int a[], int b[], int c[]) {
	int tmp[50005];
	c[0] = a[0] - b[0] + 1;
	for (int i=c[0]; i>0; i--) {
		memset(tmp, 0, sizeof(tmp));	
		numcpy(b, tmp, i);// 清零
		while (compare(a, tmp) >= 0) {
			c[i]++;
			jian(a, tmp);	// 用減法模擬		
		} 
	}
	while (c[0] > 0 && c[c[0]] == 0) {
		c[0]--;
	}
	return;
}

int main() {
	memset(a, 0, sizeof(a));
	memset(b, 0, sizeof(b));
	memset(c, 0, sizeof(c));
	
	init(a);
	init(b);
	chugao(a,b,c);
	print(c);	
	
	return 0;
}

如果這篇文章對(duì)你有幫助的話,請(qǐng)來(lái)個(gè)三連~~你們的支持是對(duì)我max(鼓 勵(lì))??文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-409219.html

到了這里,關(guān)于C++ 算法 高精度(較詳細(xì).)的文章就介紹完了。如果您還想了解更多內(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)文章

  • 【c++】算法:高精度(經(jīng)典加減乘除){含解析(圖解)}

    【c++】算法:高精度(經(jīng)典加減乘除){含解析(圖解)}

    Hi~?o(* ̄▽ ̄*)ブ,今天來(lái)一起看看c++算法之高精度 之后會(huì)持續(xù)更新有關(guān)c++算法系列,歡迎觀看!(#^.^#) 目錄 前言 使用高精度的目的: 基本方法介紹:? ?一、A+B?problem 基本思路解析: 具體步驟: 代碼如下: 二、A-B problem 基本思路解析: ?編輯 具體步驟: ?代碼如下: ?三

    2024年01月23日
    瀏覽(21)
  • (基礎(chǔ)算法)高精度加法,高精度減法

    (基礎(chǔ)算法)高精度加法,高精度減法

    什么叫做高精度加法呢?包括接下來(lái)的高精度減法,高精度乘法與除法都是同一個(gè)道理。正常來(lái)講的話加減乘除,四則運(yùn)算的數(shù)字都是整數(shù),也就是需要在int的范圍之內(nèi),但當(dāng)這個(gè)操作數(shù)變得非常\\\"大\\\"的時(shí)候( 其實(shí)就是一個(gè)字符串,比方說(shuō)有一個(gè)數(shù)是20位,如果用整數(shù)視角來(lái)

    2024年02月01日
    瀏覽(93)
  • C++高精度問(wèn)題

    C++高精度問(wèn)題

    C++中int不能超過(guò)2^31-1,最長(zhǎng)的long long也不能超過(guò)2^63-1,所以我們?cè)陬}目中如果碰到了很長(zhǎng)很長(zhǎng)的數(shù),并且需要進(jìn)行大數(shù)運(yùn)算時(shí),就需要高精度存儲(chǔ)。 由于int和long long的限制,我們要想存放很長(zhǎng)的數(shù)就需要利用數(shù)組存儲(chǔ),C++中可以利用STL中的vector容器存儲(chǔ) 讀?。??由于數(shù)據(jù)很大,

    2024年01月24日
    瀏覽(24)
  • C++實(shí)現(xiàn)高精度減法

    一、問(wèn)題描述: ? ? ? ?高精度算法是處理大數(shù)字的數(shù)學(xué)計(jì)算方法。在一般的科學(xué)計(jì)算中,會(huì)經(jīng)常算到小數(shù)點(diǎn)后幾百位或者更多,當(dāng)然也可能是幾千億幾百億的大數(shù)字。一般這類數(shù)字我們統(tǒng)稱為高精度數(shù),高精度算法是用計(jì)算機(jī)對(duì)于超大數(shù)據(jù)的一種模擬加,減,乘,除,乘方

    2024年02月14日
    瀏覽(28)
  • 算法筆記——高精度算法(附源碼)

    算法筆記——高精度算法(附源碼)

    ??作者介紹:22級(jí)樹(shù)莓人(計(jì)算機(jī)專業(yè)),熱愛(ài)編程<目前在c++階段, 因?yàn)樽罱鼌⒓有滦怯?jì)劃算法賽道(白佬),所以加快了腳步,果然急迫感會(huì)增加動(dòng)力 ——目標(biāo)Windows,MySQL,Qt,數(shù)據(jù)結(jié)構(gòu)與算法,Linux,多線程,會(huì)持續(xù)分享學(xué)習(xí)成果和小項(xiàng)目的 ??作者主頁(yè):熱愛(ài)編程的

    2023年04月08日
    瀏覽(91)
  • 【算法】模擬,高精度

    【算法】模擬,高精度

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

    2024年02月09日
    瀏覽(85)
  • 高精度算法詳解

    高精度算法詳解

    首先要知道為什么需要高精度算法: 高精度算法是 處理大數(shù)字 的數(shù)學(xué)計(jì)算方法,當(dāng)數(shù)字過(guò)大不能用 int 和 long long 存儲(chǔ)時(shí),我們就可以 使用string和vector類型 來(lái)存儲(chǔ)他們的每一位,然后進(jìn)行計(jì)算。 我們可以先把要輸入的兩個(gè)數(shù)字放到vector中存儲(chǔ),注意要 反著存(后邊做加法

    2024年01月17日
    瀏覽(93)
  • 高精度算法筆記·····························

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

    加法 減法 乘法 除法 高精度加法的步驟: 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)
  • 基于matlab的高精度信號(hào)峰值檢測(cè)算法

    基于matlab的高精度信號(hào)峰值檢測(cè)算法

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

    2024年02月12日
    瀏覽(89)
  • 求2的N次冪(C++)解決高精度運(yùn)算

    求2的N次冪(C++)解決高精度運(yùn)算

    ???內(nèi)容專欄:《C/C++專欄》 ??本文概括: 計(jì)算高精度的2的N次方數(shù)字。 ??本文作者:花 碟 ??發(fā)布時(shí)間:2023.6.22 為什么不直接利用int、float、double等類型進(jìn)行存儲(chǔ)計(jì)算,因?yàn)樗鼈兪谴嬖谟行?shù)據(jù)范圍的, 比如說(shuō) int 的范圍是 -2147483648 ~ 2147483647 字節(jié),數(shù)值最多占據(jù)10位,

    2024年02月10日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包