我的算法基础实验代码-上篇

简介: 算法题目

第一题

题目简介

由1,3,4,5,7,8六个数字组成的六位数中,能被11整除的最大的数是多少,每个数字至多用一次。

解题思路

==暴力枚举==,没想到什么好办法,就是穷举所有数字,然后判断能不能被11整除,使用一个变量初始化为-1,用来存放满足条件得最大值,根据后面查找得结果来替换存放最大值得变量得值。但是上述这个暴力破解时空开销都非常大。

改进

整除11的数有个特殊性质,比如121,1-2+1=0,0刚好是11的倍数,也就是这个数满足每一位数交替求和是11的倍数的话,那么这个数就一定能被11整除,根据这个特性可以稍微修改以下代码判断满足条件最大的时间开销。

package com.sixWeek;

import java.util.Scanner;

/**
 * @author WangYH
 * @version 2021.1.3
 * @date 2023/4/1 20:08
 */

public class Algo_1 {
   
    public static void main(String[] args) {
   
        /**
         * 由1,3,4,5,7,8这6个数字组成六位数中,能被11整除的最大的数是多少。
         */
        int[] arr  = new int[6];
        System.out.println("请输入6个数");
        for (int i = 0;i < 6;i++){
   
            arr[i] = new Scanner(System.in).nextInt();
        }
        int MaxNum = -1;

        for (int a : arr){
   
            for (int b : arr){
   
                if (b != a){
   
                    for (int c : arr){
   
                        if (c != a && c != b){
   
                            for (int d : arr){
   
                                if (d != a && d != b && d != c){
   
                                    for (int e : arr){
   
                                        if (e != a && e != b && e != c && e != d){
   
                                            for (int f : arr){
   
                                                if (f != a && f != b && f != c && f != d && f != e){
   
                                                    int sum = a - b + c - d + e - f;
                                                    if (sum % 11 == 0){
   
                                                        int num = a * 100000 + b * 10000 + c * 1000 + d * 100 + e * 10 + f;
                                                        if (num > MaxNum){
   
                                                            MaxNum = num;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        System.out.println("The largest number composed of 1,3,4,5,7,8 that is divisible by 11 is: " + MaxNum);
    }
}

这题还有一个递归版本的,感兴趣可以看下

算法实验第一题--递归版本



---

第二题

题目描述

请用1,2,5,7,8,9,每个数字至多用一次,组成一个五位数,满足能被75整除的数有多少个。

解题思路

75=3*25,这个数满足被3和25整除,若要被3整除,则满足每个位上的数字之和是3的倍数,从这里优化可以减少计算时间开销。相比组合成本来的数然后整除75还是要快一点的。

package com.sixWeek;

import java.util.Scanner;

/**
 * @author WangYH
 * @version 2021.1.3
 * @date 2023/4/1 15:38
 */

public class Algo_2 {
   
    public static void main(String[] args) {
   
        /**
         * 这是算法实验第二题
         * 求1,2,5,7,8,9组成能被75整除的数一共有多少
         */
        int[] digits = new int[6];
        System.out.println("请依次输入六个数");
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 6; i++) {
   
            digits[i] = sc.nextInt();
        }
        int count = 0;

        for (int a : digits) {
   
            for (int b : digits) {
   
                if (b != a) {
   
                    for (int c : digits) {
   
                        if (c != a && c != b) {
   
                            for (int d : digits) {
   
                                if (d != a && d != b && d != c) {
   
                                    for (int e : digits) {
   
                                        if (e != a && e != b && e != c && e != d) {
   
                                            if (d == 0 && e == 0 || d == 2 && e == 5 || d == 5 && e == 0 || d == 7 && e == 5){
   
                                                int num = a + b + c + d + e;
                                                if (num % 3 == 0){
   
                                                    count++;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        System.out.println("一共有" + count + "个这样的数。");
    }
}



---

第三题

题目介绍

一个小于200的自然数,被7整除剩余2,被8整除剩余3,被9整除剩余1,这个数是多少。

解题思路

发现7-2=8-3=5,这个数加上5可以同时被7和8整除,根据这个可以简单优化暴力法。

package com.sixWeek;

/**
 * @author WangYH
 * @version 2021.1.3
 * @date 2023/4/1 16:06
 */

public class Algo_3 {
   
    public static void main(String[] args) {
   
        /**
         * 这是算法实验第三题
         * 一个小于200的自然数,被7除余2,被8除余3,被9除余1
         * 这个数是多少
         */
        int sum = 20;
        for (int i = sum;i <= 200;i++){
   
            if((i + 5) % 56 == 0){
   
                if (i % 9 == 1){
   
                    System.out.println(i + "就是我们要找的数");
                }
            }
        }
    }
}



---

第四题

题目介绍

在所有的两位数中,十位上的数比个位上的数字要大的共有多少个?三位数中百位比个位大的数有多少个。

解题思路

我的想法就是用两个变量分别代替十位和个位,进行比较,设置计数器。三位数的类似。做完三位数的发现似乎有规律,两位的是45个,三位的是450个,四位数的是4500个,每次都是扩大十倍。

package com.sixWeek;

import java.util.FormatFlagsConversionMismatchException;

/**
 * @author WangYH
 * @version 2021.1.3
 * @date 2023/4/1 16:20
 */

public class Algo_4 {
   
    public static void main(String[] args) {
   
        /**
         * 找到两位数十位比个位的数的个数
         * 找到三位百位比个位大的数的个数
         */
       int count1 = 0;
       for (int i = 1; i <= 9; i++){
   
           for (int j = 0;j <= 9;j++){
   
               if(i > j){
   
                   count1++;
               }
               else {
   
                   break;
               }
           }
       }
        System.out.println("两位数一共有:" + count1 + "个满足要求");

       int count2 = 0;
       for (int i = 1; i <= 9; i++) {
   
           for (int j = 0; j <= 9; j++) {
   
               int k;
               for (k = 0; k <= 9; k++) {
   
                   if (i > k){
   
                       count2++;
                   }
                   else {
   
                       break;
                   }
               }
               if (i < k){
   
                   break;
               }
           }
       }
        System.out.println("三位数一共有:" + count2 + "个满足要求");


        int count3 = 0;
        int j,k,l = 0;
        for (int i = 1; i <= 9; i++) {
   
            for ( j = 0;j <= 9; j++) {
   
                for ( k = 0;k <= 9;k++){
   
                    for ( l = 0;l <= 9; l++){
   
                        if (i > l){
   
                            count3++;
                        }
                        else {
   
                            break;
                        }
                    }
                    if (i < l){
   
                        break;
                    }
                }
                if (i < l){
   
                    break;
                }
            }
        }
        System.out.println(count3);
    }
}



---

第五题

题目介绍

求 s=a+aa+aaa+aaaa+...,a是一个数,一共几个数相加由键盘控制,请输入输入两个数,第一个是相加数字,第二个是相加数字个数。

解题思路

刚开始想的是,a到aa的变换可以使用字符串的拼接,然后字符串和整型互转,发现这样有点麻烦,不如直接用数学规律,2到22加上20就好了,22到222加上200就好了。
发现变化的是10的对应次数乘以输入的第一个数,然后和上一个相加就可以,一个循环搞定。

例如
==input==

5 3

==output==

615

package com.sixWeek;

import java.util.Scanner;

/**
 * @author WangYH
 * @version 2021.1.3
 * @date 2023/4/1 16:51
 */

public class Algo_5 {
   
    public static void main(String[] args) {
   
        /**
         * 求 s=a+aa+aaa+aaaa+...
         * a是一个数,几个数相加由键盘控制
         * 输入两个数,第一个是相加数字,第二个是相加数字个数
         */
        Scanner sc = new Scanner(System.in);
        System.out.println("输入两个,第一个代表相加数字,第二个代表相加个数");
        long a = sc.nextInt();
        long tmp = a;
        long b = sc.nextInt();
        long sum = 0;
           for (int i = 1; i <= b; i++) {
   
           sum += a;
           a += (long) (tmp * Math.pow(10,i));
       }
        System.out.println(sum);
    }
}



---

第六题

题目介绍

打印图案,输入一个数字N,代表图的行数,就是如下所示一个棱形

第六题图片

解题思路

这里可以将其分成上下两部分来打印,分成两部分要考虑行数是技术还是偶数,两种处理方法略有不同

总体思路平均分成两部分,若是==奇数==,我选择将上半部分多一行,打印图形有三个变量控制,首先是打印第几行,其次这一行有多少空格,最后这行多少个星号,分别用三个变量控制这三个要点。
上半部分,行数变化从1到N/2+1或者是N/2,这个要根据奇数偶数来确定,在此循环里嵌套打印空格和星号的两个循环。观察发现空格出现规律是一共打印的行数减去现在打印的行数,这里循环变量从0开始的,星号出现的规律,从一个开始,换一行加两个。注意,打印完一行要注意换行。

下半部分,行数肯定是N/2,空格是第一行一个,换一行加一个,星号是两倍行数减去一,也是打印完一行记得换行。

奇数偶数有细小的差别,主要是少了一行,可能空格会少一个。

以上只是解题的一个思路,规律肯定不止上面这个的。

package com.sixWeek;

import javax.xml.transform.Source;
import java.util.Scanner;

/**
 * @author WangYH
 * @version 2021.1.3
 * @date 2023/4/1 17:14
 */

public class Algo_6 {
   
    public static void main(String[] args) {
   
        /**
         * 打印指定行数棱形图案
         */

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图案行数");
        int N = sc.nextInt();
        int a = 1,b = 1;;

        if (N % 2 != 0){
   
            int n = N / 2 + 1;


            for (int k = 1;k <= n;k++){
   
                int i = 0;
                for ( i = 0;i < n - k;i++){
   
                    System.out.print(" ");
                }
                for (int j =0;j < a;j++){
   
                    System.out.print("*");
                }
                System.out.print("\n");
                a += 2;
            }


            for (int l = N - n;l > 0;l--){
   
                for (int j = 0;j < b;j++){
   
                    System.out.print(" ");
                }
                for (int k = 0;k < (2 * l - 1);k++){
   
                    System.out.print("*");
                }
                System.out.print("\n");
                b++;
            }

        }
        else {
   
            int n = N / 2;
            for (int k = 1;k <= n;k++){
   
                int i = 0;
                for ( i = 0;i < n - k;i++){
   
                    System.out.print(" ");
                }
                for (int j =0;j < a;j++){
   
                    System.out.print("*");
                }
                System.out.print("\n");
                a += 2;
            }

            for (int l = N - n;l > 0;l--){
   
                for (int j = 1;j < b;j++){
   
                    System.out.print(" ");
                }
                for (int k = 0;k < (2 * l - 1);k++){
   
                    System.out.print("*");
                }
                System.out.print("\n");
                b++;
            }
        }

    }
}


打印棱形优化

==不区分上下两部分==,直接用一个循环来控制打印上下部分,这里想到数轴,可以利用绝对值性质,达到同时控制上下部分,可以先不断减小,然后接着又增大,不多说,直接上代码。将判断条件修改一下,还可以打印空心的棱形。

package com.sixWeek;

import java.util.Scanner;

/**
 * @author WangYH
 * @version 2021.1.3
 * @date 2023/4/1 17:14
 */

public class Algo_6 {
   
    public static void main(String[] args) {
   
        /**
         * 打印指定行数棱形图案
         */

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图案行数");
        int n = sc.nextInt();
        int N = n / 2;
        System.out.println("输入要打印的字符");
        char ch = sc.next().charAt(0);

        for (int i = -N; i < (N + 1); i++) {
   
            int absN = Math.abs(i);
            //获取总行数和绝对值之间得差距,判断需要打印多少个指定字符
            int diff = N-absN;

            for (int j = -N; j < (N + 1); j++) {
   
                int absj = Math.abs(j);
                //将判断条件改成等于,可以打印空心得棱形
                if (absj <= diff){
   
                    System.out.print(ch);
                }else {
   
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }
}


打印棱形再次优化

package com.sixWeek;

import java.util.Scanner;

/**
 * @author WangYH
 * @version 2021.1.3
 * @date 2023/4/1 17:14
 */

public class Algo_6 {
   
    public static void main(String[] args) {
   
        /**
         * 打印指定行数棱形图案
         */

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入图案行数");
        int n = sc.nextInt();
        int N = n / 2;
        System.out.println("输入要打印的字符");
        char ch = sc.next().charAt(0);

        for (int i = -N; i < (N + 1); i++) {
   
            int absN = Math.abs(i);
            //获取总行数和绝对值之间得差距,判断需要打印多少个指定字符
            int diff = N-absN;

            for (int j = -N; j < (N + 1); j++) {
   
                int absj = Math.abs(j);
                //将判断条件改成等于,可以打印空心得棱形
                if (absj <= diff){
   
                    System.out.print(ch);
                }else {
   
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }
}
目录
相关文章
|
7天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
19天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
19 3
|
17天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
1月前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
105 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
23天前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
17 0
|
1月前
|
算法
计科一二班算法数据结构实验9答案
计科一二班算法数据结构实验9答案
14 0
|
1月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
19 0
|
2月前
|
机器学习/深度学习 存储 算法
经典算法代码
这段代码展示了多个经典算法,包括:穷举法解决“百钱买百鸡”问题;递推法计算“猴子吃桃”问题;迭代法求解斐波那契数列及折纸高度超越珠峰的问题。同时,还提供了希尔排序算法实现及披萨票务订购系统和汉诺塔问题的链表存储解决方案。每部分通过具体案例解释了算法的应用场景与实现方法。
31 3