求a^b前n位和后n位
求解a^b后n位就不說了,直接用快速冪就行了;
主要講的是a^b前n位:在網(wǎng)上看了題解才有點明白
m=n^n;兩邊同取對數(shù),得到,log10(m)=n*log10(n);再得到,m=10^(n*log10(n));
然后,對于10的整數(shù)次冪,第一位是1,所以,第一位數(shù)取決于n*log10(n)的小數(shù)部分
總之,log很強大啊,在求一個數(shù)的位數(shù)上,在將大整數(shù)化成范圍內(nèi)的整數(shù)上,在指數(shù)問題上
對于一個>=1的正整數(shù)m,10^(log10(m)-(int)log10(m))這個值,是原值m的1/k,k=1,10,100,1000...
為什么呢,看下面:
m=375,375=10^2.5740312677277188
對于一個>=1的正整數(shù)m,我們假設(shè)m=10^(a+b),a為指數(shù)的整數(shù)部分,b為指數(shù)的小數(shù)部分
(對比上面,如果m=375,那么a=2,b=0.5740312677277188)
則log10(m)-(int)log10(m)=(a+b)-a=b; 那么10^b是什么東西呢?
對于任意數(shù)m,m=10^(a+b)=10^a*10^b,顯然10^a={1,10,100,1000,10000...};
也就說,10^(b的小數(shù)部分)最終將直接影響最左邊的N位數(shù)。將這個結(jié)果乘以1,就是前1位的答案,乘以10,就是前2位的答案。。。類推
#include<iostream> #include<cmath> using namespace std; int pow(int a,int k) //后3位數(shù)的快速冪算法 { int ans=1; a%=1000; while(k) { if(k&1) { ans=ans*a; ans%=1000; } a=a*a; a%=1000; k>>=1; } return ans; } int main() { __int64 c; double a,b; int n,m,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); a=m*log10(0.0+n); c=(__int64)a; //整數(shù)部分 b=a-c; //小數(shù)部分 c=(__int64)(pow(10.0,b)*100); //結(jié)果乘以100,也就意味著是前3位 printf("%I64d...%03d\n",c,pow(n,m)); } return 0; }
總結(jié)
以上是生活随笔為你收集整理的求a^b前n位和后n位的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 之 贪吃蛇
- 下一篇: B站,被扫黄了!B站变P站?