poj1183 反正切函数的应用(水)

 

这一题主要是推导过程+注意一下范围。

 

// 由公式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\n",m+n);
    
    return 0;
}

 

posted @ 2013-12-07 15:29  polebug  阅读(370)  评论(0编辑  收藏  举报