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