首页 > 代码库 > POJ 1715 Hexadecimal Numbers 组合数学
POJ 1715 Hexadecimal Numbers 组合数学
POJ 1715 Hexadecimal Numbers 组合数学
题目地址
题意:
一个十六进制,最多8位而且每一位都不能重复,求所有符合的数中第n大的数。注意不能有前导0。
分析:
可以发现,第i位的任何一个取值,都有P(unused, i - 1)个数字串,只要从高位向低位,从F到1找过去,看第n个是否在这个区间里面,如果没有的话就把那位置为0,然后找下一位就行了。
代码:
/* * Author: illuz <iilluzen[at]gmail.com> * File: 1715.cpp * Create Date: 2014-05-27 09:11:41 * Descripton: */ #include <cstdio> char ch[20], res[10]; int n; int P(int tot, int get) { int ret = 1; while (get--) { ret *= tot; tot--; } return ret; } void init() { for (int i = 0; i < 10; i++) ch[i] = '0' + i; for (int i = 0; i < 6; i++) ch[i + 10] = 'A' + i; } void solve(int n) { bool vis[16] = {0}, head = false; int used = 0, tmp; for (int i = 8; i > 0; i--) { int j; for (j = 15; j > 0; j--) { if (!vis[j]) { tmp = P(16 - used - 1, i - 1); if (tmp < n) { n -= tmp; } else { vis[j] = true; break; } } } res[i] = ch[j]; if (head || j != 0) used++; if (j != 0) head = true; } } int main() { init(); scanf("%d", &n); solve(n); bool head = false; for (int i = 8; i > 0; i--) if (head || res[i] != '0') { printf("%c", res[i]); head = true; } puts(""); return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。