【每日编程Day29】有假币

目录

一、选择题

二、编程题

1、有假币


一、选择题

重点复习选择题4,8,10。

问题4:

类方法:又称为静态方法。而实例方法不能加static,又叫非静态方法。

类方法和实例方法的区别_类方法和实例方法区别_及可不遥的博客-CSDN博客

(1)A错误,类的实例方法是与该类的实例对象相关联的,不能直接调用,只能通过创建超类的一个实例对象,再进行调用。
(2)B错误,当父类的类方法定义为private时,对子类是不可见的,所以子类无法调用。
(3)C错误,子类具体的实例方法对父类是不可见的,所以无法直接调用, 只能通过创建子类的一个实例对象,再进行调用。
(4)D正确,实例方法可以调用自己类中的实例方法 。


问题10:

考点:【JavaSE】关于直接赋值法与new方式产生对象的区别?

        直接赋值法:(private String name=“abc”):先看常量池中有没有这个String对象,如果没有的话就创建一个,有的话直接拿到它的一个引用;
(1)name没有被static修饰,所以每实例化一个对象都会执行private String name=“abc”,第一次执行的时候发现字符串常量池没有value数组为[‘a’,‘b’,‘c’]的String对象,所以创建一个,因此结果是false;

(2)但是第二次的时候发现已经有了这样的对象了,所以只是拿到这个对象的一个引用而已,因此2的结果返回true。
(3)执行 test.name == testB.name 的时候比较的是两个 name 指向的内存是不是同一个(比较引用本身没有意义),所以test.name==testB.name的结果也是true。

参考博客

 访问权限:


二、编程题

1、有假币

 

 

 

 【思路】

已知假币比真币要轻,要求速度最快,问最多需要多少次?

1、要求最快:因此要考虑分几组最为合适?

那理论上来说,肯定是分的份数越少说明越快,因为次数越多,说明花费的时间越多。那么两堆和三堆比较,分成两堆的话,每次称重之后只能排除一半的几率,但是分三堆就可以排除2/3的几率,更加高效一些。

2、根据硬币数主要有下面几种情况:

(1)如果只有一个硬币:说明一定是假币,比较次数为0;

(2)如果有三个之内的硬币数(包含三个):比较次数为1;

(3)如果是大于三个的硬币数:

        如果n%3==0,硬币数能够被均分,取三份中的最大的那份,n=n/3;

不能被均分的,此时只会多出一个或者两个硬币,虽然取其中最大的一份,需要将多余的这一个或者两个硬币都加上,但是因为是要速度最快,我们尽量满足“均分”这一条件,将硬币分的均匀,所以如果多一个,此时的最大的那份的个数就是n/3+1,另外两份相等时n/3;但是如果是多两个,那么我们将这多余的两个也分到不同的份中,因此此时的相等的那两份是n/3+1,另一份是n/3。因此最多的那份都是n/3+1。

(比如:11分的话,分成的是4,4,3 而不是3,3,5。n = 11/3+1)

        因此这么分下来,三份中一定有两份是相同的,每次都先比较相同的两份,如果相等,说明假币在第三份中,如果不相等,此时假币就在这两份中的轻的那份里面。

参考博客1

参考博客2

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            int n = sc.nextInt();
            //如果输入数字0,表示结束
            if(n == 0){
                break;
            }
            //如果只有一张,则一定是假币
            if(n == 1){
                System.out.println(0);
            } //如果有三张以下的钱,则最多称重一次
            else if (n <= 3) {
                System.out.println(1);
            }  //当假币数量大于三时,进行三等分:
            else if (n > 3) {
                int count = 1;
                while (n >3){
                    //如果能够等分:n表示等分后每份中的数量
                    if(n % 3 == 0){
                        n/=3;
                    }else{//不能等分:
                        n = n/3+1;
                    }
                    count++;
                }
                System.out.println(count);
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_48479056/article/details/131402640