本文主要是介绍NYOJ-题目(Math)--139-------------------------我排第几个,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
package org.acm.math;// 思路:康托展开,先准备1-12的阶乘/** 康托展开的例子:* 如我想知道321是{1,2,3}中第几个小的数可以这样考虑 :* 第一位是3,当第一位的数小于3时,那排列数小于321 如 123、 213 ,小于3的数有1、2 。* 所以有2*2!个。再看小于第二位2的:小于2的数只有一个就是1 ,* 所以有1*1!=1 所以小于321的{1,2,3}排列数有2*2!+1*1!=5个。* 所以321是第6个小的数。 2*2!+1*1!+0*0!就是康托展开。* */import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;public class Math_139 {private static int data[] = { 0, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600 };private static boolean vis[] = new boolean[13];// 记录哪些数字出现过了public static void main(String[] args) throws IOException {StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));st.nextToken();int t = (int) st.nval;while (t-- > 0) {st.nextToken();String str = st.sval;Arrays.fill(vis, false);// 初始化,所有字母都没有出现过int count = 1;// 结果int whochar;// 表示abcdefghijkl,12个字母分别对应的12个数字,1,2,3....for (int i = 0; i < str.length(); i++) {whochar = str.charAt(i) - 96;vis[whochar] = true;// 出现了就记录为trueint count_small = 0;// 初始化,这个whochar有0个比它小的数// 访问比whochar小的数,如果有还没出现的,就++for (int j = 1; j < whochar; j++) {if (!vis[j])count_small++;}count = count + count_small * data[12 - i - 1];}System.out.println(count);}}
}
<a target=_blank href="http://acm.nyist.net/JudgeOnline/problem.php?pid=139">http://acm.nyist.net/JudgeOnline/problem.php?pid=139</a>
这篇关于NYOJ-题目(Math)--139-------------------------我排第几个的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!