蓝桥试题 历届试题 带分数

试题 历届试题 带分数

试题 历届试题 带分数
  
资源限制
时间限制:1.0s   内存限制:256.0MB
问题描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

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

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

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

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

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

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

样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6

直接全排列,然后在对数据进行分割判断

static int[] qp = {1,2,3,4,5,6,7,8,9};
//全排列函数
private static void fullPermutation(int k){
    if (k==qp.length-1){
        f();
    }
    for (int i = k; i < qp.length; i++) {
        {int s = qp[k];
         qp[k] = qp[i];
         qp[i] = s;}
        fullPermutation(k+1);
        { int  s = qp[k];
         qp[k] = qp[i];
         qp[i] = s; }
    }
}
我们设组成的三个数分别为 a,b,c
a:第一个整数
b:分子
c:分母
通过对题意的理解我们会发现a,b,c需要满足以下条件
 a < n;
 b%c==0;
 由此我们可以推断出另外两个条件
 b>c --> b和c至少占一位
 所有 a最多由7个数组成
private static void f() {
        int a = 0,b=0,c=0;//要组合出的三个数
        //进行减少运算 当b>0;c>0则b,c至少占用一个数,a最多有7位,
        for (int i = 0; i < qp.length-2; i++) {
            a = 0;
            for (int j = 0;j<=i;j++){
                a=a*10+qp[j];
            }
            if (a>=n) return; //如果 a>=n了 直接结束

            for (int j = i+1; j < qp.length-1; j++) {
                b=0;c=0;
                for (int k = i+1; k <= j; k++) {
                    b = b*10+qp[k];
                }
                for (int k = j+1; k < qp.length; k++) {
                    c = c*10+qp[k];
                }
                if (c>b||b%c!=0) continue;
                if (a+b/c==n){
                    count++;
                }
            }
        }

}


//完整代码

package com.zy.lanqiao;

import java.util.Scanner;

public class _带分数 {
    static int[] qp = {1,2,3,4,5,6,7,8,9};
    static int n; //输入n
    static int count = 0; //种类数
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        fullPermutation(0);
        System.out.println(count);
    }
    private static void fullPermutation(int k){
        if (k==qp.length-1){
            f();
        }
        for (int i = k; i < qp.length; i++) {
            {int s = qp[k];
            qp[k] = qp[i];
            qp[i] = s;}
            fullPermutation(k+1);
            { int  s = qp[k];
            qp[k] = qp[i];
            qp[i] = s; }
        }
    }

    private static void f() {
        int a = 0,b=0,c=0;//要组合出的三个数
        //进行减少运算 当b>0;c>0则b,c至少占用一个数,a最多有7位,
        for (int i = 0; i < qp.length-2; i++) {
            a = 0;
            for (int j = 0;j<=i;j++){
                a=a*10+qp[j];
            }
            if (a>=n) return; //如果 a>=n了 直接结束

            for (int j = i+1; j < qp.length-1; j++) {
                b=0;c=0;
                for (int k = i+1; k <= j; k++) {
                    b = b*10+qp[k];
                }
                for (int k = j+1; k < qp.length; k++) {
                    c = c*10+qp[k];
                }
                if (c>b||b%c!=0) continue;
                if (a+b/c==n){
                    count++;
                }
            }
        }

    }
}

发布了28 篇原创文章 · 获赞 1 · 访问量 577

猜你喜欢

转载自blog.csdn.net/qq_41911729/article/details/104572045