poj1019--Number Sequence题解

本文介绍了一种算法,用于确定由所有正整数依次连接而成的无限序列中指定位置的数字。通过分段计算不同长度数字的数量来定位目标数字,并进一步精确定位到该数字中的具体位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该问题很简单,我们分三步完成

1.首先找到i在哪个小的连续的子整数序列当中。

2.然后找到i在该子序列的第几个数中。

3.最后确定i位于该自然数的第几位。

#include<iostream> using namespace std; int GetNumber(int pos) { int i = 1,j,sum = 0; while(1) { if(i>=100000) sum += 6; else if(i>=10000) sum += 5; else if(i>=1000) sum += 4; else if(i>=100) sum += 3; else if(i>=10) sum += 2; else sum += 1; if(pos>sum) { pos -= sum; i++; } else break; } int len = 1; for(j=1;j<=i;j++) { if(j>=100000) len = 6; else if(j>=10000) len = 5; else if(j>=1000) len = 4; else if(j>=100) len = 3; else if(j>=10) len = 2; else len = 1; if(pos>len) pos -= len; else break; } for(int k=0;k<len-pos;k++) { j /= 10; } j %= 10; return j; } int main() { int testNum,pos; cin>>testNum; int *number = new int[testNum]; for(int i=0;i<testNum;i++) { cin>>pos; number[i] = GetNumber(pos); } for(int i=0;i<testNum;i++) { cout<<number[i]<<endl; } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值