PKU 1019 Number Sequence

第一点还是注意理解题意吧,像S10这个序列,第10个integer是‘1’而非‘10’

起初因为搞错了意思用二次配方的方法在写,明白过来后开始无从下手,于是参考了讨论区的代码……

收获:

1. sprintf函数。sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。

2. <algorithm>库中的lower_bound函数。lower_bound与upper_bound都是二分函数,头文件<algorithm> 
upper_bound返回第一个大于的元素的下标; 
lower_bound返回第一个大于等于元素的下标。

代码:

#include<stdio.h>
#include<algorithm>
using namespace std;
#define MAX 40000
int main(){
	char s[10];
	unsigned int group[MAX],sum[MAX];
	int i,j,t,n,tmp;
	group[0]=sum[0]=0;
	for(i=1;i<MAX;i++){
		group[i]=group[i-1]+1+(i/10>0)+(i/100>0)+(i/1000>0)+(i/10000>0);//相当于在求sk 
		sum[i]= sum[i-1]+group[i];	//在求s1+s2+...+sk 
	}
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		i = lower_bound(sum,sum+MAX,n)-sum;//在哪一组
		j = n - sum[i-1];
		i = lower_bound(group,group+MAX,j)-group;//在哪一个数中
		sprintf(s,"%d",i);
		j -= group[i-1];
		printf("%c\n",s[j-1]);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值