鴿了這麼多天,今天來學學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...