演算法競賽入門經典高精度運算推薦題目

2021-07-04 00:21:39 字數 3144 閱讀 1072

origin

title

satus

uva 424

integer inquiry

acuva 10106

product

acuva 465

overflow

acuva 748

exponentiation

acuva 10494

if we were a child againac

大數相加可以通過模擬來實現,即兩大數從個位起逐位數字相加,相加得到的數字範圍在[0, 18]之間,再與結果集當前位相加(此時範圍應在[0,19]之間),取十位置入結果集的進一位,取個位置入結果集的本位.

1 2

+ 8 9

—————-

(0)11

1 (1)9

0 (1)

1 —————-

1 0 1

由上述可知,將大數倒序儲存是乙個好的選擇.

此外,為了方便地輸入,較多使用字元陣列儲存,在做數字運算時,切勿忘記-『0』以獲得數字.

還有一件事,高精度運算類的題目在除錯時,可以嘗試輸出中間量,以檢查演算法是否正確.

還有一件事,因為是倒序儲存,那麼前導0是必須處理的,可以從結果集的最高位向下減小直到當前位不是0,也可以設定乙個最高位索引(注意進製時索引也要增加). 從此位倒序輸出倒序陣列,即獲得無前導0的正序大數.

#include 

#include

int main(void)}}

for (i = 120-1; in[i] == 0; i--);

for (; i >= 0; i--)

printf("%d", in[i]);

printf("\n");

return

0;}

大數乘法,可以模擬.

1 2

× 1 2

—————-

(0)4

4 (0)2

2 (2)2

4 (0)1

1 —————-

1 4 4

建議將較大的陣列放入全域性區,避免re(runtime error)嗯.

#include 

#include

int main(void)

}for (k = i * j; r[k] == 0 && k > 0; k--);

for (; k >= 0; k--) printf("%d", r[k]); printf("\n");

}return

0;}

int有點小,會溢位,換double問題解決(並不是適用於所有情況,比如可能會影響到精度問題)~

關於int的範圍可以參見.

/* minimum and maximum values a `signed int』 can hold. */

# define int_min (-int_max - 1)

# define int_max 2147483647

#include 

#include

int main(void)

return

0;}

求k次冪,可以把它當作k次乘法,乙個數的第i(i = 0, 1, 2, … , k-1)次冪與其本身相乘.

本題的資料帶有小數點,但是小數點可以在計算時忽略,為什麼呢?因為小數點的移動步長是可以推算的,無需在計算時帶入.

注意前導0後導0.

#include 

#include

int res[310], num[6], numc[310];

void cal_exp(int n)}}

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

cal_exp(n-1);

}int main(void)

else

}memset(numc, 0, sizeof(numc));

memset(r, '\0', sizeof(r));

cal_exp(n);

for (k = 0, i = 0; res[i]==0; i++, k++);

for (j = 0; i < 310; i++)

for (i = 310-1; r[i] == 0 || r[i] == 48; i--);

for (; i >=0; i--)

printf("%c", r[i]);

printf("\n");

}return

0;}

小數除大數,大數除以小數,模擬走起,被除數從最高位起,向下一位取數,再除以除數,得到的即是商,最後被除數字數排滿了,即再做除法運算將獲得小數的數即為餘數.

_________

12 ) 1 4 5

(0)1 / 12 = 0 …… (1)

(1)4 / 12 = 1 …… (2)

(2)5 / 12 = 2 …… [1]

_0__1__2_ …… 1

12 ) 1 4 5

重要的事情記三遍0

#include 

#include

#define maxn 1005

char a[maxn], c, div[maxn];

long b, mod;

void cal(void)

mod = n;

return;

}int main(void)

else

if (c == '%')

}return

0;}

演算法入門經典 高精度部分總結

這部分初步練習主要是以下幾題 uvaoj的424,10106,464,748,10494 總結而言,分為大數加減,乘法,除法只涉及了高精度 非高精度 加法相對簡單,注意進製即可。乘法主要是先將兩數所有位對應兩兩相乘,數a的i位和數b的j位相乘結果先存入result i j 不斷累加,最後一起計算進製...

演算法 高精度運算

本人知識 while 1 cout int型別的變數只能存放 2 31 2 31 1範圍的資料 long long型別的變數只能存放 2 63 2 63 1範圍的資料 對於大數階乘這種肯定是存不下,因此我們需要用陣列存放資料 下面是乙個高精度運算的例子 用高精度計算出s 1 2 3 n n 50 s...

高精度演算法 入門

高精度演算法是基礎演算法中比較實用的演算法之一,它主要應用於大數之間的運算。主要是在超過lo nglo ng範圍時應用,或者兩者進行運算後超過lo nglo ng的範圍的計算。高精度是利用字元來存一串 或者 利用乙個陣列來存乙個數字。其實像小學數學一樣列乙個豎式就能看懂了。結構體 struct no...