思路
这个规律是很明显的,跟据 n 判断出所在的层数(可以提前打表),然后对 9 取模就行(整除时输出 9)。
代码
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
LL num[66000];
// 普通查找
//int find(int value)
//{
// for(int i=0; ; i++)
// {
// if(value<=num[i]) return i-1;
// }
//}
// 二分查找
// 由于序列有序,二分查找会快很多,不过写二分时一定要细心
int find(int l, int r, int value)
{
if(l==r) return l-1;
int mid = (l+r)/2;
if(value>num[mid]) return find(mid+1, r, value);
else return find(l, mid, value);
}
int main()
{
int i;
for(i=1; num[i-1]<=(((LL)1)<<31); i++)
{
num[i] = num[i-1] + i;
}
int k, n;
scanf("%d", &k);
while(k--)
{
scanf("%d", &n);
int temp = (n-num[find(1, i, n)])%9;
if(temp==0) printf("9\n");
else printf("%d\n", temp%9);
}
return 0;
}