第一题

题目简介

由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();}}
}

我的算法基础实验代码-上篇相关推荐

  1. [nRF51822] 8、基础实验代码解析大全 · 实验11 - PPI

    前一篇分析了前十个基础实验的代码,从这里开始分析后十个~ 一.PPI原理: PPI(Programmable Peripheral Interconnect),中文翻译为可编程外设互连. 在nRF51 ...

  2. GIS算法基础实验1高斯克吕格的正反算

    主题:用编程实现高斯克吕格的正反算 目录 目的 算法思想 计算模型 程序说明 结果分析 一.目的 通过编程进一步体会和掌握高斯克吕格的正反算算法. 二.算法思想 高斯投影-正算公式就是由大地坐标(L, ...

  3. java实验报告合肥工业大学_合肥工业大学数据结构上机实验代码与实验报告(全)github地址...

    C++实现链队类--合肥工业大学数据结构实验5:链式队列 实验5 5.1 实验目的 熟练掌握队列的顺序链式存储结构. 熟练掌握队列的有关算法设计,并在链队列上实现. 根据具体给定的需求,合理设计并实现 ...

  4. python程序设计与基础教程第六章上机实验_《Python程序设计与算法基础教程》教学大纲.doc...

    PAGE 1/ NUMPAGES 2 作者:江红.余青松 定价:59元 ISBN:9787302466833 <算法与程序设计>课程教学大纲 Programming and algorit ...

  5. 送书 | 你一定能看懂的算法基础书(代码示例基于Python)

    本文引自图灵教育<算法图解> 你一定能看懂的算法基础书:代码示例基于Python:400多个示意图,生动介绍算法执行过程:展示不同算法在性能方面的优缺点:教会你用常见算法解决每天面临的实际 ...

  6. JAVA代码—算法基础:数独问题(Sodoku Puzzles)

    JAVA代码-算法基础:数独问题(Sodoku Puzzles) 数独问题(Sodoku Puzzles) 数独游戏(日语:数独 すうどく)是一种源自18世纪末的瑞士的游戏,后在美国发展.并在日本得以 ...

  7. 贪心算法 0-1背包c语言,贪心算法0-1背包问题(算法实验代码).pdf

    . 实验三. 0-1 背包问题(贪心算法) 实验代码: #include int max(int a,int b) { if(a>b) return a; else return b; } vo ...

  8. c语言八数码A星算法代码解析,八数码问题c语言a星算法详细实验报告含代码解析...

    八数码问题c语言a星算法详细实验报告含代码解析 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 一.实验内容和要求 八数码问题:在3 ...

  9. 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...

    OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分  .<计算 ...

最新文章

  1. JavaScript深度学习
  2. MPEG简介 + 如何计算CBR 和VBR的MP3的播放时间
  3. 赠书:京东当当新书榜TOP1的“算法小抄”!
  4. Django项目--web聊天室
  5. V4L2编程 视频采集
  6. 【风控模型】Logistic算法构建标准信用评分卡模型python代码案例
  7. UVA 11178 Morley’s Theorem(莫雷定理 计算几何)
  8. jquery替换onclick的方法
  9. Windows Phone开发(46):与Socket有个约会 转:http://blog.csdn.net/tcjiaan/article/details/7669315...
  10. 七、jdk工具之jconsole命令(Java Monitoring and Management Console)
  11. TensorFlow 2.0简介
  12. 程序员在工作中如何快速成长和学习?
  13. postgresql源码学习(十)—— 常规锁③-主锁表与进程锁表的初始化与查询
  14. matlab怎么加采样开关,开关量采集模块怎么使用?
  15. 【Canvas】js如何设置canvas绕图形中心旋转
  16. 人工智能究竟离我们有多远?
  17. Flutter高仿微信-第22篇-支付-二维码收款(二维码)
  18. 刘强东:中国几千万穷人是富人耻辱!网友狂点赞;12月全球数据库排名出炉...
  19. 学哪种编程语言比较好?
  20. Python实现验证码的获取

热门文章

  1. JS前端取得并解析后台服务器返回的JSON数据的方法
  2. 查看文件时去除注释说明内容(原创贴-转载请注明出处)
  3. vue的两种路由模式原理
  4. 【怀旧】利用Altair 8800模拟器加载4K Basic解释器(附下载连接)
  5. 【兴趣书签】类似《看不见的客人》的惊悚电影推荐
  6. GNU Radio Stream Tags
  7. PMBOK(第六版) PMP笔记——《四》第四章(项目整合管理)
  8. Dashy: 一款功能超强大,颜值爆表的可定制专属导航页工具
  9. idea本地项目部署到远程windows服务器
  10. NODEMCU 固件编译