寻找页码题解

发布时间 2023-07-09 13:27:09作者: 蝠气满满

首先看题目,我也不知道这一题的出处。。。。在网上找了很久也没找到。。。

题目描述

从第1页开始,页码组成的数字序列如下:123..10 11 12..99 100 101...

这串序列又被称之为连写数。给定一个 09 之中的单独一位数字 a,请问在这串序列中,第 k 次出现 a ,是在哪一页上?以数码 1 为例,第一次出现在第 1 页,第二次出现在第 10 页,第三次和第四次都出现在第11页上。

输入格式

第一行:两个整数a和k输出格式

输出格式

单个整数表示答案

数据范围

$ 0 ≤a≤9$
$1 ≤k≤100 $

样例数据

输入: 15
输出: 12
输入: 223
输出: 120

解析


这是一道基础的题,首先要会判断一个数的位数,如果不会的话就上打表大法:

if(1<n&&n<10) len=1;
if(10<n&&n<100) len=2;
if(100<n&&n<1000) len=3;
if(1000<n&&n<10000) len=4;
if(10000<n&&n<100000) len=5;
   ...

但是可以这样写,当 n 不为 0 时,每次记录长度并删除一位:

while(n/*>0*/)
{
	len++;
	n=n/10;
}

接着要推测循环的次数,也就是出现次数的范围,我这里是用 \(k^{2}\) ,因为这样能在保证效率的同时够使用,也可以用其他的,最后累加答案并输出即可。

参考代码:

#include<bits/stdc++.h>
using namespace std;
int a,k;
int pd(int n)
{
	int long_=1;
	int m=n;
	int ans=0; 
	while(n>0)
	{
		int q=n%10;
		if(q==a)
		{
			ans++;
		}
		n=n/10;
	}
	return ans;
}
int main()
{
	
	scanf("%d%d",&a,&k);
	int i = 1;
	int num=0;
	for(i = 1;i<=k*k;i++)
	{
		int cut=pd(i);
		num+=cut;
		if(num>=k)
		{
			cout<<i;
			break;
		}
		
	}
	return 0;  //华丽结束
}