经典算法(一)

算法:

为啥要学算法:程序=数据结构+算法。
数据结构是数据组织的一种方式,算法的话,举个很简单的例子:
有个题目:计算1到100之间所有数的和?
传统的最笨的方法就是逐个累加,即1+2=3,3+3=6,6+4=10,……,算到100就需要计算99次;
但是后来有人发现了规律:
1+100=2+99=3+98=……=50+51,那不就是100/2=50个101相加嘛,所以直接等于(1+100)*100/2,即首末相加除以2就可以。其实这就是算法。
下面给大家介绍几个经典的算法题:

1. 百元百鸡

公鸡:5元一只
母鸡:3元一只
小鸡:1元三只
问:100元买100只 有几种方案

首先我们先分析题目要求:

  1. 一共100块钱;
  2. 要买100只

所以我们可以得到:把公鸡设x,母鸡y,小鸡z
x+y+z = 100,5x+3y+(z/3)=100
鸡的数量和为100,金额和为100
上代码(Java语言版,其他语言版可以参考其他博主文章,但是思路写法都一样的)

public class test3 {
    
    
    public static void main(String[] args) {
    
    
        for(int x=0;x<=20;x++){
    
    
            for(int y=0;y<=33;y++){
    
    
                for(int z=0;z<=100;z++){
    
    
                    if(x+y+z==100){
    
    
                        if(x*5+y*3+(z/3)==100&&z%3==0){
    
    
                            System.out.println("公鸡:"+x+",母鸡:"+y+"小鸡:"+z);
                        }
                    }
                }
            }
        }
    }
}

结果:
在这里插入图片描述

2:不死神兔

一对兔子,从出生后第三个月起,每个月生一对兔子,小兔子长到第三个月后又生一对兔子,问第20个月有几只兔子。

思路:一对兔子,第三个月才开始生,所以第一和第二个月都是只有一对,我们可以用数组来表示:
题目要求一共20个月,所以:

int []arr = new int[20];  //创建一个20长度的数组

第一个月 :arr[0] = 1;
第二个月: arr[1] = 1;
第三个月,因为生了一对,所以:arr[2] = 2;
第四个月:因为第三个月生的小兔子还没到三个月,所以不会生,所以只有刚开始的那一对会生一对小兔子,所以:arr[3] = 3;
第五个月:原本有三对,加上刚开始的兔子生一对,3月份的兔子到了第三月,也会生一对,所以:arr[4] = 5;
因此我们会发现一个规律:arr[i] = arr[i-1] + arr[i-2];
当前月兔子数量等于前一个月和前两个月的兔子的和
上代码:

public class test4 {
    
    
    public static void main(String[] args) {
    
    
        int []arr = new int[20];
        arr[0] = 1;
        arr[1] = 1;
        for(int i=2;i<arr.length;i++){
    
    
            arr[i] = arr[i-1] + arr[i-2];
        }
        System.out.println("第20个月有:"+arr[19]);
    }
}
//结果:第20个月有:6765

3:逢七过

1-100内,数字包含7和是7的倍数就要说过,打印需要说“过”的数字:
思路:

  1. 1-100内,数字包含7:有7,17,27,37,47,57,67,70-79,87,97
  2. 是7的倍数:7,14,21,28,35,42,49,56,63,70,77,84,91,98

表达式:

  1. i%10==7 取十位判断是否为7
  2. i/10%10==7 取个位判断是否为7
  3. i%7==0 判断是否为7个倍数

上代码:

public class test5 {
    
    
    public static void main(String[] args) {
    
    
        for(int i=0;i<=100;i++){
    
    
            if(i%10==7 || i/10%10==7 || i%7==0){
    
    
                System.out.print(i+",");
            }

        }
    }
}
//结果:
//0,7,14,17,21,27,28,35,37,42,47,49,56,57,63
//67,70,71,72,73,74,75,76,77,78,79,84,87,91,97,98

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_57310550/article/details/122296348#comments_22415537