/* 题目描述: 给你一个n张卡片,你要用这n张卡片上的数字拼出一个新数, 例如给你三张卡片: * * * *** * * * * **** * *** * * * * * *** 你可以拼出145或者541。 输入: 多组测试数据,第一行是一个数n(1<=n<=1000000),第二行是 长度为n的由0-9组成的数字串,分别表示n张卡片上的点阵数字, 最后当输入的n为0的时候结束。 输出: 输出最大所能拼出来的整数数 样例输入: 2 25 4 7849 0 样例输出: 52 9874 难度:very easy */ // 这其实可以算是一道IQ题... #include <cstdio> const int NUM_TOTAL = 10; // 0到9一共十个数 int main() { int numOccurance[NUM_TOTAL] = {0}; // 此数组记录每个数字出现的次数 int n = 0; // 用户输入的位数 while( scanf("%d", &n) != EOF && n != 0 ) { getchar(); // 消耗输入残留的回车 // 统计各数字出现的次数 for( int i = 0; i < n; i++ ) numOccurance[getchar() - '0']++; // 重点! 点阵数字的6和9可以颠倒互转 // 所以要拼出最大的整数, 必须把所有的6都当成9 numOccurance[9] += numOccurance[6]; numOccurance[6] = 0; // 根据统计结果, 从最大位数倒序输出, 以获得最大整数 for( int i = NUM_TOTAL - 1; i >= 0; i-- ) // 按数字出现的次数进行输出 while( numOccurance[i] != 0 ) { putchar(i + '0'); numOccurance[i]--; // 将统计结果清零以便进行下一轮计算 } putchar('/n'); } return 0; }