大數 高精度運算 C語言

2021-10-05 21:45:26 字數 2176 閱讀 6913

鴿了這麼多天,今天來學學acm的入門知識

高精度–也就是數字位數太多需要我們自己定義來表示

我們可以直接用陣列,

或者將值和數的長度封裝成結構體來表示

#include

#include

#define maxn 100000

typedef

struct bignum bignum;

那我們知道大數不能和其他資料型別一樣簡單的用scanf,printf輸入輸出

所以需要自己定義

//大數儲存

intstring2num

(char str,

int num)

return length;

}

//大數輸出

void

output

(int num,

int length)

}

除了一位一位儲存,也可以壓位儲存下面說說大數運算

首先是大數的加法

可以手動模擬來尋找思路,

重點需要用carry來表示進製

int

add(

int a,

int length_a,

int b,

int length_b,

int c)

if(carry !=

0) c[length_c++

]= carry;

return length_c;

}

下面是結構體形式的原始碼

bignum add

(bignum a,bignum b)

if(carry !=

0) c.val[c.len++

]= carry;

return c;

}

大數的減法

重點在於借位,同時也要注意0的處理

bignum minus

(bignum a,bignum b)

while

(c.val[c.len -1]

==0&& c.len >

1) c.len --

;return c;

}

大數的乘法

多位*一位與加法類似

//多位*一位

intmulti

(int a,

int len_a,

int b,

int c)

if(carry !=

0) c[len_c ++

]= carry;

return len_c;

}

多位 * 多位轉化成多位 * 一位來做

int

multi

(int a,

int len_a,

int b,

int len_b,

int c)

}while

(len_c ==

0&& len_c >

0) len_c --

;return len_c;

}

最後是大數除法

注意要記錄餘數

舉個多位 / 一位的栗子

//高精度除以低精度

bignum divide

(bignum a,

int b,

int&rest)

while

(c.val[c.len--]==

0&&c.len >

0) c.len --

;return c;

}

多位 / 多位留給大家自己寫啦

因為我還沒寫,沒法分享原始碼了

多說一下

在運算類似 35654611365646486 +(-54487816151311531531315)這種時

需要自己用sig來記錄數的正負,進而轉換到上述運算中去。

明天見~

大數(高精度)運算

在數 算中,經常會碰到這樣的問題 參與運算的資料很大或者對運算結果的精度要求很高。而在計算機語言中,描述資料的資料型別的位元組數是固定的,因此其有大小和精度的限制。例如在c c 語言中,整型int 32位 的範圍在 2 31 2 31 1,即 2,147,483,648 2,147,483,647,...

高精度運算(大數)

求模 mod 直接在草稿紙上用小學方法算除法就能看出來 1 include2 include 3char m 1010 4 int main 10 printf d n temp 11 12return0 13 大數階乘 模板。理解就好。1 include2 include 3 define n 1...

大數運算(高精度運算)

給定兩個正整數,計算它們的和。輸入格式 共兩行,每行包含乙個整數。輸出格式 共一行,包含所求的和。資料範圍 1 整數長度 100000 輸入樣例 1223 輸出樣例 35 include include include using namespace std typedef long long ll...