AOJ 758 大數的位數

2022-07-29 13:24:12 字數 1928 閱讀 3289

大數的位數

time limit: 1000 ms   case time limit: 1000 ms   memory limit: 64 mb

total submission: 30   submission accepted: 9

description

給出乙個整數,確定這個數的階乘的位數。

input

多組資料,每行為乙個大於等於1且小於等於107的整數n.

output

對應每個輸入資料輸出乙個結果。

sample input

original

transformed

10

20

sample output

original

transformed

7

19

兩種方法可能可以實現:

拋去一定的精度來計算

採用數學公式計算

對於第一種方法,我們可以得知,對於兩個大數相乘,其較低位對結果的影響較小,因此我們可以捨棄一些資料

採用類似於科學記數法的形式來計算(a*10^b)

這種做法,當n較大時,會由於誤差的累積導致錯誤。

而第二種方法可以採用一些數學公式計算

log10n! = log10(1*2*3*......*n) = log101+log102+log103+...+log10n

顯然,等式右側我們可以輕易得出。

而等式左側,log10n的意義是n對10的對數,即10log10n=n

對於乙個整數k,若10k

k+1,我們可以得出結論,n是k位數

所以,大數n!的位數就是log10n!,由於int的向下取整性質,我們還要將這個數再加上1

雖然題目上說的最大值是107,然而,最大值至少是197(方法1wa)

ac**:github

1/*2

by:ohyee

3github:ohyee

4homepage:

5email:[email protected]

6blog:

かしこいかわいい?

9エリーチカ!

10要寫出來хорошо的**哦~

11*/

1213 #include 14 #include 15 #include 16 #include 17 #include

18 #include 19 #include 20 #include 21 #include 22 #include 23 #include 24

using

namespace

std;

2526

//debug mode

27#define debug 0

2829

//迴圈

30#define rep(n) for(int o=0;o31

32const

int maxn = 10005;33

bool

tree[maxn];

3435

int bit(int

n) 45}46

47while(a)

5152

return

e;53}54

55//

n! = 1*2*3*4*5*......*(n-1)*n

56//

ln n! = ln 1+len2+......ln(n-1)+ln n

57int mathbit(int

n) 63

6465

bool

do()

7475

intmain()

17 大數問題 列印1到最大的n位數

1.反轉兩個字串,便於從低位到高位相加和最高位的進製導致和的位數增加 2.對齊兩個字串,即短字串的高位用 0 補齊,便於後面的相加 3.從頭遍歷,把兩個正整數的每一位都相加,並加上進製 4.最高位有進製則補上進製 5.逆序輸出 public static void main string args ...

1027 大數的乘法

給出一些整數對,乙個是可能接近100位的大數,另乙個只有1位數,求這些整數對的乘積。1 1 123 0 12345678910 8 123456789101234567891012345678910 71 098765431280 864197523708641975237086419752370s...

演算法題目1 大數的階乘

這個問題是乙個朋友聊天的時候突然聊到,在計算c語言中如何計算大數的階乘。10!在c語言完全沒問題,但是如果是100!1000!的話如何實現。當時我不加思索給出下的 大數的階乘 100!錯誤 define crt secure no warnings include include include i...