C C 高精度運算 大整數運算 詳解(含壓位)

2022-04-07 07:37:44 字數 2809 閱讀 4103

1.1 高精度加法        高精度運算的基本運算就是加和減。和算數的加減規則一樣,模擬豎式計算,考慮錯位運算與進製處理。下面是我老師給的**,目前比網上其他的**要精簡和巧妙。

#include #include int main()

, b[202]=;

scanf("%s%s", a, b);

int alen = strlen(a), blen = strlen(b), t = 0, i;

int a1[202]=, b1[202]=;

for (i = 0; i < alen; i++) a1[i] = a[alen-1-i]-'0';

for (i = 0; i < blen; i++) b1[i] = b[blen-1-i]-'0';

alen = (alen > blen) ? alen : blen;

for (i = 0; i <= alen; i++)

t = a1[i]+b1[i], a1[i] = t%10, a1[i+1] += t/10;

while (!a1[i] && i) i--;

for(; i >= 0; i--) printf("%d", a1[i]);

return 0;

}

1.2高精度加法(壓位)

int型可以存9位數字,而上述**在陣列的每個元素中只存了0-9中的一位數,可以說浪費了很多空間,而且計算機計算4+5和3333+4444用的時間是相同的,所以我們有時候用壓位來節省空間和時間。其原理如下:

以下是我老師給的**:

#include #include #include using namespace std;

const int inf = 1e8;

struct data

void change(string a)

void print()

}a, b;

int main()

2.1 高精度減法

原理和加法一樣,需要不過考慮的不是進製,而是借位。

**如下:

#include #include int main()

, b[202]=;

scanf("%s%s", a, b);

int alen = strlen(a), blen = strlen(b), t = 0, i;

int a1[202]=, b1[202]=;

for (i = 0; i < alen; i++) a1[i] = a[alen-1-i]-'0';

for (i = 0; i < blen; i++) b1[i] = b[blen-1-i]-'0';

alen = (alen > blen) ? alen : blen;

for (i = 0; i <= alen; i++)

t = a1[i]-b1[i], t<0?(t+=10,a1[i+1]--):t, a1[i] = t;

while (!a1[i] && i) i--;

for(; i >= 0; i--) printf("%d", a1[i]);

return 0;

}

2.2 高精度減法(壓位)

減法和加法大同小異,如果你會了加法,那麼減法也不足為懼。以下**是我自己寫的,和我老師寫的有一定差距,如有不足請指出。

#include #include #include using namespace std;

const int inf = 1e8;

struct data

void change(string a)

void print()

}a, b;

int main()

以上的倆個**都只能當且僅當a>=b時才能正常工作,望注意。

3.1 高精度乘法        這個方法出自吳永輝老師。此**簡直讓我拍手叫絕。原理如下:

3    2    1    0                 

——>陣列a、b的下標

3    4    5    6       i           

——>陣列a

*  1    2    7    8       j           

——>陣列b

2    7    6    4    8 

2    4    1    9    2

6    9    1    2

3    4    5    6

4    4    1    6    7    6    8                ——>陣列c

6    5    4    3    2    1    0        i+j   

——>陣列c的下標

以上是倆個四位數相乘的豎式計算方法。可以看出,數的右面對齊,從低位向高位計算,計算結束後將一列結果相加即為答案。那麼把倆個數從右向左依次標記為0、1、2...n,那麼每一列的結果就是第乙個數的

下標為i的數

與第二個數的

下標為j的數

相乘的結果,其存放在第i+j列。最終結果是每一列相加,就是i+j這一列所有數相加。所以可以用c[i+j] += a[i]*b[j]。

for(int i = 0;i < la-1;i++)

for(int j = 0;j < lb-1;j++)

c[i+j] += a[i]*b[j];

for(int i = 0;i < la+lb;i++)

if(c[i] >= 10)

3.2 高精度乘法(壓位)

高精度整數運算

問題描述 編寫乙個程式,進行高精度整數的加 減 乘運算。輸入兩個十進位製大整數m和 n m n最長可達 50位 根據要求計算運算結果並輸出。輸入形式 標準輸入上依次分行輸入以下內容 1.第一行輸入第乙個大整數m。m可能帶有負號,後面是最長可達 50位的數字序列。2.第二行只有乙個字元,可以是 分別代...

經典例題 高精度(大整數)運算

大整數運算 1.藍橋杯 大整數階乘 問題描述 輸入乙個正整數n,輸出n 的值。其中n 1 2 3 n 解決思路 n 非常大,可以使用陣列儲存各位,a 0 表示最低位,初始化為1,然後迴圈,每一位都乘以2 3 n,根據各位大小判斷是否向前進製,最後逆序輸出各位即可 include include us...

高精度 C 中大整數運算

cin a b for i a.size 1 i 0 i for i b.size 1 i 0 i include include using namespace std const int n 1e6 10 10防止出現邊界問題 vector int add vector int a,vector...