標籤:
數的長度:
N!是非常大的數,計算公式為:N!=N*(N-1)*(N-2)……2*1.現在需要知道N!有多少(十進位)位。每行輸入1個正整數N。對於每個N,輸出N!的(十進位)位元
分析:
所謂N!的(十進位)位元,就是(lgN!)+1,根據數學公式,有N!=1*2*3……(N-1)*N,所以lgN!=lg2+lg3……lgN。
#include<stdio.h>#include<math.h>int main(void){ int N,i;//定義正整數N double sum;//定義N!(十進位)位元 while(scanf("%d",&N)!=EOF) { sum=0.0; for(i=2;i<=N;++i) { sum=sum+log10(i); } printf("%d\n",(int)sum+1); } return 0;}
最左邊的數
/*給一個正整數N,請輸入N^N最左邊的數。
輸入包含一系列測數組,輸入組的第一行為整數T,表示共有T組,每組測試組包含一個正整數N,1<=N<=1000000000.
輸出N^N最左邊的書。
分析:
本題目主要是給定一個正整數N,計算N^N的結果的最高位上的數位值。
如果通過求N^N的最後結果然後再求最高位元字,方法簡單,但是存在問題,就是N比較大的時候,N^N太大而無法用程式儲存,需要設計大數的儲存方案,且帶來了計算過程中的難度
而且消耗大量記憶體空間和時間,不可取。
另一種方法,設N^N=d..10^(k-1),其中k表示N^N的位元,那麼d.=10^((lgN^N)-(k-1)),再對d.*取整即可獲得最終結果。因為k等於lgN^N的整數部分加1,即k=lgN^N+1(取整)
,所以可獲得d的計算公式d=10^(lgN^N-lg10N^N)(取整)*/
#include<stdio.h> #include<math.h>int main(void){ int N,T; scanf("%d",&T); while(T--) { scanf("%d",&N); printf("%d\n",(int)pow(10,N*log10(N)-(int)(N*log10(N)))); } return 0;}
基本數學問題