问题 E: Number of numbers
时间限制: 1 Sec 内存限制: 128 MB
题目描述
有这样一个序列(1) (1 2 1) (1 2 3 2 1) (1 2 3 4 3 2 1) (1 2 3 ... n n-1 ... 3 2 1)。
问你第N个数是什么?
(括号是为了方便大家观看,请忽略掉括号)
输入
有多组测试数据,请处理到文件结束。
每组数据给定一个整数N(1 <= N <= 10^9),表示要查找的数。
输出
每组数据输出一个整数,表示序列中的第N个数。
样例输入
1
2
3
样例输出
1
1
2
思路:题意为找出第n个数是几。看题目中,一个括号可以看做一个整体,第n个括号里共有(2n-1)个数,根据等差数列求和,求出前n个
括号,即前n个数列共有多少个数字,求和公式,s=(1+2n-1)*n/2=n*n;所以本题中令N=n*n;开根号可以求出在第几个括号,括号里的第几
个。开方若为整数,说明是括号最后一位,不是整数,重点考虑。
#include<cstdio> #include<cmath> int main() { double n,m; int d; while(~scanf("%lf",&n)) { m=sqrt(n); int x=m; int y=m+1; if(x==m)//即n开平方后是整数,说明第n个数在第m个括号最后一个是1; printf("1\n"); else//不是整数,说明在第m+1个括号内, { d=n-x*x;//代表在第m+1个括号里的第几个 if(d<=y)//说明就是d,因为从1开始递增 printf("%d\n",d); else//对称递减了 { d=2*y-d; printf("%d\n",d); } } } return 0; }