蓝桥杯——带分数

100可以表示为带分数的形式:100 = 3 + 69258 / 714;还可以表示为:100 = 82 + 3546 / 197。注意要求:带分数中,数字1---9分别出现且只出现一次(不包含0)。

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

【输入格式】

 仅1行,要表示的数N

【输出格式】

 仅一行,表示N有几中符合要求的表示方法

【样例输入】

        100

【样例输出】

        11

【评测样例规模】

        N<1000*1000

/**
 * @author quanran
 * @create 2021-12-05 14:18
 */
public class MixNum {

    public static void main(String[] args) {
        Scanner ss = new Scanner(System.in);
        System.out.println("请输入N");
        int N = ss.nextInt();
        //arg 用于后面判断 数字1---9分别出现且只出现一次
        String[] arr = new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9"};
        // 带分数必定满足公式 : N = i + ( t / j )
        // i 不能包含0,从1开始,且小于N
        // j 从2开始,j不会大于10000  因为 测试范围 N < 1000 * 1000
        // “i” + “t”  + “j” 如果他们转成成String然后拼起来 超过9位数 那多出来的数肯定会和前面的重复,不成立
        // 而 t 是 (N - i) * j  j的位数不能大过四位数!!!!!!!!
        // 如果大于四位数,比如占了五位数,i又至少占一位数,那 t 就最多只能四位数了
        // 五位数的j 跟 什么数相乘,都不会 得到 四位数的 t !!!!!!!!!!!
        int count = 0; //最终结果,记录符合条件的个数
        int t = 0;
        String str = "";
        for (int i = 1; i < N; i++) {
            for (int j = 2; j < 10000; j++) {
                //由公式 N = i + ( t / j )转换得 t
                t = (N - i) * j;
                // 把整个带分数 分位三个部分
                str = "" + i + t + j;
                //如果它的长度大于或者小于9,说明要么有数不全,要么有数重复,不符合条件
                if (str.length() != 9) {
                    continue;
                } else {
                    //如果yes为true,说明很yes,符合条件
                    boolean yes = false;

                    //经过上面的if语句,知道现在的 str 是符合九位数的
                    //现在来判断它有没有重复数,或者少了一个数
                    for (int k = 0; k < arr.length; k++) {
                        int tmp = str.indexOf(arr[k]);
                        //经历了一遍循环后,如果有其中一个数没找到,说明肯定不符合条件,会直接break
                        if (tmp == -1) {
                            yes = false;
                            break;
                        }
                        //如果都找到了,说明符合条件
                        yes = true;
                    }
                    if (yes) {
                        count++;
                    }
                }
            }
        }
        //最后输出结果
        System.out.println(count);
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值