• 历届试题 带分数 全排列模板 JAVA



    标题:带分数

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

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

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

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

    题目要求:
    从标准输入读入一个正整数N (N<1000*1000)
    程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
    注意:不要求输出每个表示,只统计有多少表示法!


    例如:
    用户输入:
    100
    程序输出:
    11

    再例如:
    用户输入:
    105
    程序输出:
    6


    资源约定:
    峰值内存消耗(含虚拟机) < 64M
    CPU消耗  < 3000ms

    这一题主要是熟悉全排列和数字的组合。

     1 import java.util.Scanner;
     2 
     3 public class A {
     4 
     5     static int vis[] = new int[1000 * 1001];
     6     static int a, b, c, ans;
     7 
     8     public static void main(String[] args) {
     9         int[] num = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9 };
    10         Scanner scanner = new Scanner(System.in);
    11         int n = scanner.nextInt();
    12         per(num, 0);
    13         System.out.println(vis[n]);
    14     }
    15 
    16     public static void per(int[] num, int start) {
    17         if (start == num.length) {
    18             ser(num);
    19             return;
    20         }
    21         for (int i = start; i < num.length; i++) {
    22             swap(num, start, i);
    23             per(num, start + 1);
    24             swap(num, start, i);
    25         }
    26     }
    27 
    28     public static void swap(int[] num, int n, int m) {
    29         int t = num[n];
    30         num[n] = num[m];
    31         num[m] = t;
    32     }
    33 
    34     public static void ser(int[] num) {
    35         for (int i = 0; i <= 6; i++) {
    36             for (int j = i + 1; j <= 7; j++) {
    37                 a = 0;
    38                 b = 0;
    39                 c = 0;
    40                 ans = 0;
    41                 for (int k = 0; k <= i; k++) {
    42                     a = a * 10 + num[k];
    43                 }
    44                 for (int k = i + 1; k <= j; k++) {
    45                     b = b * 10 + num[k];
    46                 }
    47                 for (int k = j + 1; k <= 8; k++) {
    48                     c = c * 10 + num[k];
    49                 }
    50                 if (b % c == 0) {
    51                     ans = a + b / c;
    52                     if (ans < 1000000)
    53                         vis[ans]++;
    54                 }
    55             }
    56         }
    57     }
    58 
    59 }
  • 相关阅读:
    Python环境的安装
    tar.xz如何解压:linux和windows下tar.xz解压命令介绍
    设置SVN忽略文件和目录(文件夹)
    C#【Thread】Interlocked 轻量级锁
    手把手教你做个AR涂涂乐
    理解UV贴图
    unity animation readonly 无法加事件?
    LUA Metatables
    增强现实阴影
    unity shader tags
  • 原文地址:https://www.cnblogs.com/16crow/p/6662424.html
Copyright © 2020-2023  润新知