数学公式题

BBP Formula HDU - 6217

数学公式题_第1张图片
题意:根据公式计算 π \pi π 在16进制表示时,小数点后第n位是多少?
思路:先将小数点右移n-1位,即乘上 1 6 n − 1 16^{n-1} 16n1 ,除去整数部分,取得小数部分后。在将小数点右移一位,即再乘上16,取得的整数部分,就是我们需要的。将该整数部分,换成16进制即可

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <vector>
#define ll long long 
using namespace std;
const int maxn=1e5+5,INF=0x3f3f3f3f;
const int mod=1e9+7;

int t,n;

ll qpow(ll base,ll n,ll mod)
{
    ll ret=1;
    while(n)
    {
        if(n&1)
            ret=ret*base%mod;
        base=base*base%mod;
        n>>=1;
    }
    return ret;
}

double f(int n,int a,int b)
{
	double ans=0;
	for(int k=0;k<=n;++k)
		ans+=1.0*qpow(16,n-k,8*k+b)*(1.0/(8.0*k+b));
	
	for(int k=n+1;k<=n+1000;++k)
		ans+=1.0*pow(16.0,1.0*n-k)*(1.0/(8.0*k+b));
	return ans*a;
}

char calc(int x)
{
	if(x>=0&&x<=9)
		return x+'0';
	else
		return x-10+'A';
}

int main()
{
	scanf("%d",&t);
	int Case=0;
	while(t--)
	{
		scanf("%d",&n);
		double res=f(n-1,4,1)-f(n-1,2,4)-f(n-1,1,5)-f(n-1,1,6);
		res=res-(int)res;
		if(res<0)
			res+=1;
		char c=calc(floor(res*16));
		printf("Case #%d: %d %c\n",++Case,n,c);
	}
	return 0;
}

你可能感兴趣的:(数学)