Gym 102452D Defining Labels 数位数字提取
题目链接
- D - Defining Labels
- 这一题是一个典型的进制转换题,但是如果不知如何转换,则可能做不出来。
- 首先,我们来看一组对应:
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 00, 01, 02, 03, ……, 99, 000, 001, 002, ……
- 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11, 12, 13, 14, ……,110,111, 112, 113, ……
- 可以看出10->9,其他的1->0, 2->1, 3->2, ……
- 只要编号中不出现9这个数,那么实际值就是原始十进制的一一对应。
- 假设一个k位的编号为d(k)d(k-1)……d(2)d(1)d(0),那么它的对应的原始十进制值应该是——(d(k)+1)*10^k^+(d(k-1)+1)*10^k-1^+……+(d(2)+1)*10²+(d(1)+1)*10+(d(0)+1)
- 逆过来就可得解题思路:将原始十进制进行数位数字提取,提取每一位时,要将此数-1再进行操作。
代码:
#include<cstdio>
using namespace std;
void dfs(int x,int k)
{
if(x==0)
{
return;
}
--x;
dfs(x/k,k);
putchar('0'+x%k+10-k);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int k,x;
scanf("%d%d",&k,&x);
dfs(x,k);
putchar('\n');
}
return 0;
}
全部评论