好吧,虽然是个水题,可以有个技巧。
有些题 可以直接用数学公式解决的、、、这里鼓励一下自己、、、、在几次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;
}
分享到:
相关推荐
hdu ACM代码 每种算法都有分类 大三了,没有时间弄ACM,这些要删了
HDU的1250,主要是利用高精度加法,但是代码有点繁琐,效率不是很高
杭电ACMhdu1163
HDU1059的代码
hdu1001解题报告
hdu 1574 passed sorce
很好很经典的组合博弈的讲义,HDU 大家下来看看很好
HDU的一题........HDU DP动态规
hdu2101AC代码
hdu acm 教案 搜索入门 hdu acm 教案 搜索入门
搜索 dfs 解题代码 hdu1241
hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。
hdu acm 教案 动态规划(1) hdu acm 教案 动态规划(1)
hdu 1166线段树代码
ACM HDU题目分类,我自己总结的大概只有十来个吧
自己做的HDU ACM已经AC的题目
HDU最全ac代码
hdu动态规划算法集锦
hdu题目分类
HDU图论题目分类