筆者總結自己的思路,有以下兩種方法解決求冪的長度,求階乘的長度。從而解決形如
「請你計算數a的b次冪共有多少位(十進位制的數)!」
「n! (n的階乘) 是非常大的數,計算公式為:n! = n * (n - 1) * (n - 2) * … * 2 * 1)。現在需要知道n!有多少(十進位制)位。」之類的問題。
解決階乘的位數
int
digit
(int n)
//求數n的階乘的長度
解決冪的位數
和解決階乘的位數相似,區別在於兩個變數
int
digit
(int a,
int b)
//求數a的b次冪的長度
解決階乘的位數
題目**
description
n! (n的階乘) 是非常大的數,計算公式為:n! = n * (n - 1) * (n - 2) * … * 2 * 1)。現在需要知道n!有多少(十進位制)位。
input
每行輸入1個正整數n。0 < n < 1000000
output
對於每個n,輸出n!的(十進位制)位數。
sample input13
32000
1000000
sample output11
130271
5565709
思路設定乙個很大的數,在對階乘不斷更新的過程中一旦超過這個數就dui10取餘,同時更新長度,以防止階乘越界。
根據0
< n <
1000000 ,筆者定義int64_t m =
1e10
const
int64_t m =
1e10
;
ac**#include
#include
#include
#include
#include
#include
#include
using
namespace std;
int64_t sum =1;
const
int m =
1e10
;//設定哨兵
intmain()
sum *
= i;
}while
(sum)
cout
}
解決冪的長度
和上述**下相比只是只改變了一點點、
題目**
description
請你計算數a的b次冪共有多少位(十進位制的數)!
input
輸入資料有多組,每組二個正整數分別為a和b,其中(1<=a<=10000,1<=b<=10000)
output
輸出a^b(a的b次冪)的值共有多少位?
sample input
2 31 1
10 5
sample output11
6ac**
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
int64_t sum =1;
const
int m =
1e10
;//計算數a的b次冪共有多少位 其中(1<=a<=10000,1<=b<=10000)
int64_t
getpowlen
(int a,
int b)
sum *
= a;
}while
(sum)
return ans;
}int
main()
筆者認為運用log10()函式更加準確,同時也對算術基本定理有了新的運用。
對於第二種演算法,如果題目給出的n的長度最大為1018,那麼哨兵會爆出int64_t所能表示的範圍,無法儲存哨兵,這類情況第二種方法也無能為力。
求n的階乘的位數
o型血的人大多數是行動派,鄭微更是將這個特徵發揮到了極致。次日上課,阮阮前所未有地發現她在課堂上奮筆疾書,大為驚訝,便湊過去問了一聲,在寫什麼呀?鄭微大大方方地向阮阮展示了她一早上的智慧型結晶,阮阮看了看,俘虜陳孝正詳細行動攻略 她念完,頓時無語。挺漂亮的一本嶄新小本本,上面已經洋洋灑灑地寫了將近十...
T T問題求位數(對數求位數)
t t這個很像乙個流淚的表情是不是!其實,它是t的t次方啦 當t比較大的時候t t會非常大,現在只要你求這個數一共有多少位就可以了。包括多組資料,每組資料為乙個整數 0 剛開始看這道題本來想用python,畢竟python的資料型別轉換起來 比較方便,用快速冪求出該數,並轉換為字串型別,在輸出字串 ...
求n!的位數
用log10 n 1向下取整可以求n的位數,若要求n 的位數,可以用log10 n 1 log10 1 log10 2 log10 3 log10 n 1 向下取整 例 蒜頭君對階乘產生了興趣,他列出了前 10個正整數的階乘以及對應位數的表 nn 位數1 1 1 2 2 1 3 6 1 4 24 2...