【HPUOJ】积分赛(一)E:Number of numbers

问题 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值