首先看题目,我也不知道这一题的出处。。。。在网上找了很久也没找到。。。
题目描述
从第1页开始,页码组成的数字序列如下:123..10 11 12..99 100 101...
这串序列又被称之为连写数。给定一个 0
到 9
之中的单独一位数字 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; //华丽结束
}
标签:10,输出,int,题解,寻找,ans,格式,页码
From: https://www.cnblogs.com/demc/p/17538640.html