原题链接:蓝桥杯算法提高VIP-阮小二买彩票
解题思路:
虽然写的有点麻烦,但都是根据自己的思路一步一步往下走的,希望可以理解
注意事项:
参考代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | import java.util.Arrays; import java.util.Scanner; public class Main { static int a[] = new int [ 7 ]; static int sum[] = new int [ 10000 ]; static int x = 0 ; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = 0 ; if (n == 0 ) System.out.println( 0 ); while (n != 0 ) { a[k] = n % 10 ; //将输入的数字每一位都储存在数组a中 n /= 10 ; k++; } Arrays.sort(a, 0 , k); //对数组a进行排序 f( 0 , k - 1 ); //调用函数 Arrays.sort(sum, 0 , x); //对数组sum进行排序 for ( int j = 0 ; j < x; j++) { if (sum[j] == sum[j + 1 ]) //两个数相等时只输出一个 continue ; /**控制字符输出的位数与输入时位数一致*/ if (k == 1 ) System.out.printf( "%d\n" , sum[j]); else if (k == 2 ) System.out.printf( "%02d\n" , sum[j]); else if (k == 3 ) System.out.printf( "%03d\n" , sum[j]); else if (k == 4 ) System.out.printf( "%04d\n" , sum[j]); else if (k == 5 ) System.out.printf( "%05d\n" , sum[j]); else if (k == 6 ) System.out.printf( "%06d\n" , sum[j]); } } private static void f( int k, int m) { int i, t; if (k == m) { //k=n即a中数字排列完一次时 for (i = 0 ; i <= m; i++) { sum[x] = a[i] + sum[x] * 10 ; //将数组a中数字合并成一个整数储存在数组sum中 } x++; } else { for (i = k; i <= m; i++) { for ( int j = i - 1 ; j >= k; j--) { t = a[j]; a[j] = a[j + 1 ]; a[j + 1 ] = t; } //循环向前交换数组a中的数字 f(k + 1 , m); for ( int j = k; j <= i - 1 ; j++) { t = a[j]; a[j] = a[j + 1 ]; a[j + 1 ] = t; } //回溯,将数组变回调用前的样子 } } } } |
9.9 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复