蓝桥杯.Java.卡片

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝有很多数字卡片,每张卡片上都是数字0 到 9。 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。

小蓝想知道自己能从 11 拼到多少。

例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。

现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 11 拼到多少?

提示:建议使用计算机编程解决问题

题目详解

1)例如小蓝有 30 张卡片,其中 0 到 9 各 3 张

在这里插入图片描述

2)第一次拼 1 到 9 (浅蓝底)

在这里插入图片描述

3)拼 10 时,就得用没用过的 0 和 1(黄底)

在这里插入图片描述

4)在拼写下一个数 11 时,就会发现只剩一个 1 。而 11 需要两个 1 ,根本不足以拼出 11 .

5)小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 11 拼到多少?

分步编写

1)定义一个数组,里面存放 卡片上的 0,1,2,3,4,5,6,7,8,9 数字

int[] num = new int[11];

2)设一个for循环, 解释 0 到 9 各 3 张卡片

for(int i =0;i<10;i++)
{
    num[i] = 3;
}

3)接下来就要说明这30张卡片里面,就得主要对10以上的数字进行拆解,在这里我们可以分成个位数和十位数

个位数:对10取模(取余) 如11 % 10 = 1 , 22 % 10 = 2 ,就可以知道这个数的个数用到的是 num2 卡片

int num2 = num1 % 10;

十位数:除以10 如 11 / 10 = 1 , 22 / 10 = 2 , 这里用 /= 赋值运算符,就能默认有一个强制类型的转换

num1 /= 10;

4)如果在num数组内,num2 所指的数还存在的话,就可以继续往下拼字,否则不行。判断条件就可以看这个num[num2] 是否大于0了。

if(--num[num2] < 0)
    {
        flag = false;
    }

5)通过不断的循环,将符合的数字一一拉出来。

注1.之所以选择 while 循环,是因为在这个循环里不知道它的迭代次数,比for循环更合适。

  1. num1 > 0 && flag 主要用于10以上的数字,并且短路与(&&)的两侧要求是 布尔表达式
while(num1 > 0 && flag)

6)如果到此 flag 为 false,就说明它不能达到我们筛选的条件,到此就可以截止了。

if(!flag)
{
    break;
}

7)综上,只要出现不符合我们筛选的条件,我们就可以到此截止,再进行统计,看看究竟可以拼到哪个数字。

 counts += 1;

参考代码

package Java.practice;

import java.util.Scanner;

//小蓝有很多数字卡片,每张卡片上都是数字0 到 9。
// 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,
// 每拼一个, 就保存起来,卡片就不能用来拼其它数了。
//小蓝想知道自己能从 11 拼到多少。
//例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,
// 但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。
// 现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,
// 请问小蓝可以从 11 拼到多少?
public class Dog
{
    public static void main(String[] args)
    {
        int[] num = new int[11];
        for(int i =0;i<10;i++)
        {
            num[i] = 3;
        }
        int counts = 0;
        for(int j = 1;j<30;j++)
        {
            int num1 = j;
            boolean flag = true;
            while(num1 > 0 && flag)
            {
                int num2 = num1 % 10;//11除以10余1
                num1 /= 10;
                if(--num[num2] < 0)
                    {
                        flag = false;
                    }
            }

            if(!flag)
            {
                break;
            }
            counts += 1;
        }
          System.out.println(counts);
    }
}

参考示例;

10

最后最后

这里只是求了“当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10”的问题,与原来蓝桥杯的“小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 11 拼到多少?”有数据上的出入,各位可以参考代码,来解决蓝桥杯的问题。(っ*´Д`)っ

``

你可能感兴趣的:(蓝桥杯(自用积累),1024程序员节,java,蓝桥杯)