关闭

hdu1597的两种解法

474人阅读 评论(0) 收藏 举报

好吧,虽然是个水题,可以有个技巧。
有些题 可以直接用数学公式解决的、、、这里鼓励一下自己、、、、在几次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;
}


2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:104699次
    • 积分:2117
    • 等级:
    • 排名:第17966名
    • 原创:91篇
    • 转载:4篇
    • 译文:0篇
    • 评论:75条
    文章分类
    最新评论