求PI的十六进制表示的小数点后第n位是多少,看其他博主说要求第n位,只需要把16进制下的小数点挪到第n-1位和第n位之间,即*16^(n-1),然后去掉整数部分,小数部分再乘16得到的整数部分即是第n位
公式分解详解https://blog.csdn.net/meopass/article/details/78327614
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
char change(int ans){
if(ans>=0&&ans<=9)
return ans+'0';
return ans+55; //十六进制转换
}
ll quick_pow(ll a,ll b,ll mod){ //快速模幂
ll ans=1;
while(b){
if(b&1)
ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
double bbp(int n,ll k,ll b){ //bbp公式
double res=0;
for(int i=0;i<=n;i++){
res+=(quick_pow(16,n-i,8*i+b)*1.0/(8*i+b)); //保证高精度
}
for(int i=n+1;i<=n+1+1000;i++){
res+=(pow(16,n-i)*1.0/(8*i+b)); //直接求幂
}
return k*res;
}
int main(){
int t,n,cnt;
cnt=0;
scanf("%d",&t);
while(t--){
cnt++;
scanf("%d",&n);
n--;
double ans=0;
ans=bbp(n,4,1)-bbp(n,2,4)-bbp(n,1,5)-bbp(n,1,6); //小数部分
ans=ans-int(ans);
if(ans<0)
ans+=1;
ans*=16; //整数部分
char result=change(ans);
printf("Case #%d: %d %c\n",cnt,n+1,result);
}
return 0;
}