思路
這個規律是很明顯的,跟據 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;
}