hdu 6217 BBP Formula

题目链接

求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;
}

猜你喜欢

转载自blog.csdn.net/lidengdengter/article/details/81104210