`
java-mans
  • 浏览: 11438823 次
文章分类
社区版块
存档分类
最新评论

hdu1597的两种解法

 
阅读更多

好吧,虽然是个水题,可以有个技巧。
有些题 可以直接用数学公式解决的、、、这里鼓励一下自己、、、、在几次WA后,忍了忍 一直没看解题报告大笑

法一:

打表,记录1-65535的和(开始没有注意到,计算到100000000,sum还是不够2^31,后来算算前n项和才用计算到65535而已)。

由此也发现一个问题,数字的存储是一个循环,先是正数,然后超出正数范围后变成负数,再超出负数范围变成正数。

#include <iostream>
using namespace std;
int sum[65536];
int main()
{
	int k;
	cin>>k;
	int i;sum[0]=0;
	for(i=1;i<65536;i++)
		sum[i]=sum[i-1]+i;
	while(k--)
	{
		int m;cin>>m;
		for(i=1;i<65536;i++)
			if(m<=sum[i]) break;
			m-=sum[i-1];
			m%=9;
			if(m==0) cout<<"9"<<endl;
			else cout<<m<<endl;
	}
	return 0;
}
法二:

转变为解一元二次方程,因为前n项的和m=n*(n+1)/2.于是,n=sqrt(2m+0.25)-0.5【ceil是向上取整函数】

代码:

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    unsigned long n;
    int k;
    while(cin>>k)
    {
        while(k--)
        {
            cin>>n;
                double i=ceil(sqrt(2*n*1.0+0.25)-0.5);   //ceil()函数为向上取整
                unsigned long j=(unsigned long)i-1;
                n=n-j*(j+1)/2;
                if(n%9)cout<<n%9<<endl;
                else cout<<9<<endl;
        }
    }
    return 0;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics