题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1597
收获:挺简单的~~
我是先根据求和公式算出该数是位于哪一行(Sn)~~
然后求前一行的数字个数之和sum,再用该数减去sum,求出位于第n行的哪个位置~~
对于每一行,是九个数循环一次,对于9或9的倍数对9求余,为0,;其他的数,对9求余即为相应的数~~
S1 1
S2 1 2
S3 1 2 3
S4 1 2 3 4
…………
输入的数为N;
n*(n+1)/2=N;
求n(即为S的下标,该数位于的行数)
我的代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main()
{
__int64 k,n;
scanf("%I64d",&k);
while(k--)
{scanf("%I64d",&n);
__int64 t;
t=(sqrt(1+8*n*1.0)-1)/2;
long double p;//防溢出
p=(sqrt(1+8*n*1.0)-1)/2;
if((int)p!=p)t++; //判断求出的n是小数还是整数(也即整数后面的小数点全为0)
//为什么要判断呢,因为假设n=1.4,表明的是N位于第二行;n=1,即位于第一行
__int64 w;
w=n-(t-1)*t/2;
if(w%9==0)printf("9\n");
else printf("%I64d\n",w%9);
}
return 0;
}