飞道的博客

【每日蓝桥】17、一三年省赛Java组真题“带分数”

317人阅读  评论(0)

你好呀,我是灰小猿,一个超会写bug的程序猿!

欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!

标题:带分数

100可以表示为带分数的形式:100=3 + 69258 / 714

还可以表示为;100 = 82 + 3546 / 197

注意特征:带分数中,数字1~9分别出现且只出现1次(不包含0)

类似这样的带分数,100有11种表示法

题目要求:

从标准输入读入一个正整数N(N<1000*1000)

程序输出该数字用数码1~9不重复不遗漏的组成带分数表示的全部种数。

注意:不要求输出每个表示,只统计有多少表示法。

例如:

用户输入:

100

程序输出:

11

再例如:

用户输入:

105

程序输出:

6

 

资源约定:

峰值内存消耗(含虚拟机)< 64M

CPU消耗 < 3000ms

请严格按要求输出,不要画蛇添足的打印类似“请您输入...”的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:不要使用package语句,不要使用jdk1.6及以上的版本特性

注意:主类的名称必须是Main 否则按无效代码处理。

解题思路:

求解本题的关键就在于对本题目的理解,和使用递归加回溯实现数组的全排列,我们可以把这道题看成是对1~9这九个数的全排列,然后对于每一种可能性,将该可能性的数组分割成三份,也就是形成上题中的三个数,然后将符合要求的分割一一枚举出来即可。

答案源码:


   
  1. package 一三年省赛真题;
  2. import java.util.Scanner;
  3. public class Year2013_Bt9 {
  4. static int N;
  5. static int answer;
  6. public static void main(String[] args) {
  7. Scanner scanner = new Scanner(System.in);
  8. N = scanner.nextInt();
  9. int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
  10. // int[] arr = {1,2,3};
  11. f(arr, 0);
  12. System.out.println(answer);
  13. }
  14. //排列组合,确定第K位
  15. private static void f(int[] arr, int k) {
  16. if (k == arr.length) {
  17. check(arr);
  18. }
  19. for ( int i = k; i < arr.length; i++) {
  20. int t = arr[k];
  21. arr[k] = arr[i];
  22. arr[i] = t;
  23. f(arr, k+ 1);
  24. t = arr[k];
  25. arr[k] = arr[i];
  26. arr[i] = t;
  27. }
  28. }
  29. /**
  30. * 检查组合后的数组是否符合可以组成带分数
  31. * */
  32. private static void check(int[] arr) {
  33. for ( int i = 1; i <= 7; i++) {
  34. int num1 = toInt(arr, 0, i); //获得第一个数字
  35. if (num1>=N) {
  36. break;
  37. }
  38. /**
  39. * 从之后的数组中选取出组成第二个数的元素,
  40. * 起始元素的下标是i
  41. * 取出的元素个数是j
  42. */
  43. for ( int j = 1; j <= 9-i- 1; j++) {
  44. int num2 = toInt(arr, i, j);
  45. int num3 = toInt(arr, i+j, 9-i-j);
  46. //当符合题目中的带分数要求,且最后的除数是正好除尽时,种数加1
  47. if ((num1 + num2 / num3)==N&&num2%num3== 0) {
  48. answer++;
  49. }
  50. }
  51. }
  52. }
  53. /**
  54. * 将数组元素组合成一个整数
  55. * @param arr 待组合的数组
  56. * @param pos 起始下标
  57. * @param len 组合的位数
  58. * @return 组合结果
  59. * */
  60. private static int toInt(int[] arr,int pos,int len) {
  61. int ans = 0;
  62. int t = 1;
  63. for ( int i = pos+len- 1; i >=pos; i--) {
  64. ans+=arr[i]*t;
  65. t*= 10;
  66. }
  67. return ans;
  68. }
  69. }

 

 

输出样例:

其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!

感兴趣的小伙伴可以关注专栏!

灰小猿陪你一起进步!


转载:https://blog.csdn.net/weixin_44985880/article/details/113406196
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场