a b的前n位數

2022-03-17 22:26:33 字數 836 閱讀 8700

假設我們現在需要知道 ab  的後 n 位數或前 n 位數,簡單直觀的做法就是求出 ab  的值,然後在分別取前 n位或後 n位,不過在 a,b很大的情況下顯然是無法儲存的。所以,直接求是不可能的了。

讓我們先來看看後 n 位如何求?因為我們只要後 n 位,那麼我們都知道把 ab  的值模上乙個10n 就是所求。根據求模的性質:ab % n = (a%n)b % n;然後用快速冪跑一遍即可。

1

intquickpow (__int64 a, __int64 b)211

return

r;12 }

關鍵是前 n 如何求?我們假設 ab = c。再設 log10 (c) = d。另 int 為 d 的整數部分,k 為小數部分,那麼 10int = 100......0(共int個0),不難發現,除了第一位是1外其餘均為0,也就說,10k 最終將直接影響最左邊的 n 位數。將這個結果乘以1,就是前1位的答案,乘以10,就是前2位的答案。。。類推!

後來發現任何乙個數字 n 都可以表示成10(a+b)

。其中 a整數,b為小數。例如

n=87455時,a=4,b=0.941784644. 

有規律.10a =10000.10b =8.7455.

所以n的左邊數起第一位數字。就是10b 的第一位有效數字,第二數字,是10^b的第二位有效數字。。。。以次類推

以hdu 1060為例:

#include #include 

#include

using

namespace

std;

intmain()

return0;

}

a的b次方的前N位數和後N位數

a b,假如a和b分別是10000000 10000000,我們知道計算機是無法儲存這樣大的數的。看來直接計算,然後取前n位和後n位,是不可能的了。先來看後n位如何計算,假設n 3。那麼不管a實際上有多大,我們的計算結果實際上只和a的後3位有關,也就是說第四位開始對我們的答案是沒有影響的,能理解麼?...

js N秒前,N分鐘前,N小時前,N天前,N月前

注意 我對原方法做了稍微改動,之前引數是時間戳,我改成了時間 然後在下面又轉換成了時間戳,因為我資料庫返回的就是時間 timeago datetime var minc diffvalue minute 計算時間差的分,時,天,周,月 var hourc diffvalue hour var day...

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