Gym 102452D Defining Labels 数位数字提取

618人浏览 / 2人评论

题目链接

  • 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;
}

全部评论