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...