大數的位數兩種方法可能可以實現: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
1020
sample output
original
transformed
719
拋去一定的精度來計算
採用數學公式計算
對於第一種方法,我們可以得知,對於兩個大數相乘,其較低位對結果的影響較小,因此我們可以捨棄一些資料
採用類似於科學記數法的形式來計算(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/*2by: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...