这一题主要是推导过程+注意一下范围。
// 由公式4你可以得到: arctan(1/a)=arctan[(1/b+1/c)/(1-1/b*c)] =>b*c-1=a(b+c); 令 b=a+m,c=a+n; =>(a+m)*(a+n)-1=a*(a+m+a+n) =>m*n=a*a+1 for (m=a;m>=1;m--) if ((a*a+1)%m==0) break; n=(a*a+1)/m;
完成了推导之后,需要注意一下输出的值的范围。
%h short %d int 有符号整数 -32767 到 32768 %u unsigned int 无符号整数 0 到 65565 %l long int 有符号长整形 %lu unsigned long 无符号长整形 %ll long long int %llu unsigned long long [c99]
下面附上我的代码。。(表示刚转c++写的程序略丑,- - 不求吐槽。。
#include<iostream> #include<cstdio> using namespace std; int main() { long long a,i,b,c,n=0,m=0; double x,y; cin>>a; for (m=a;m>=1;m--) if ((a*a+1)%m==0) break; n=(a*a+1)/m; m=m+a; n=n+a; printf("%llu ",m+n); return 0; }