算法和数据结构
算法和数据结构
没有人比我更懂暴力算法
计算机专业博士僧,JAVA语言忠实粉丝,研究方向:数据挖掘&算法。
展开
-
2021-06-04
【优化算法】简述灰狼优化算法(GWO)原理https://blog.csdn.net/haha0332/article/details/88805910智能优化算法之海豚回声定位(Dolphin echolocation,DE)https://blog.csdn.net/hba646333407/article/details/105877753原创 2021-06-04 15:52:00 · 221 阅读 · 0 评论 -
23 倒数的循环节
单位分数指分子为1的分数。分母为2至10的单位分数的十进制表示如下所示: 1/2= 0.5 1/3= 0.(3) 1/4= 0.251/5= 0.2 1/6= 0.1(6) 1/7= 0.(142857) 1/8= 0.125 1/9= 0.(1) 1/10= 0.1这里0.1(6)表示0.166666…,括号内表示有一位循环节。可以看出,1/7有六位循环节。 找出正整数d <1000,其倒数的十进制表示小数部分有最长的循环节。*** output: 983分析:只需要求出循环节的长度.原创 2020-08-30 10:43:54 · 948 阅读 · 0 评论 -
22 一千位斐波那契数
斐波那契数列是按如下递归关系定义的数列: F1 = 1F2 = 1Fn = Fn−1 + Fn−2第1项是1,第2项是1。这个数列从第3项开始,每一项都等于前两项之和。 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987, 1597,2584,4181,6765,10946,17711,28657,46368 在斐波那契数列中,第一个有三位数字的项是第12项F12。 求第一个有1000位数字的是第几项?out.原创 2020-08-29 21:15:29 · 1086 阅读 · 0 评论 -
21 字典序排列
排列指的是将一组物体进行有顺序的放置。例如,3124是数字1、2、3、4的一个排列。如果把所有排列按照数字大小或字母先后进行排序,我们称之为字典序排列。0、1、2的字典序排列是:012 021 102 120 201 210求数字0、1、2、3、4、5、6、7、8、9的字典序排列中第一百万位的排列是什么?output :2783915460算法分析:这里用到阶乘的概念,比如n可以组合成n*(n-1)*(n-2)**21中方式。只需要计算(n-1)的阶乘即可,就可以知道除了.原创 2020-08-29 18:55:47 · 726 阅读 · 0 评论 -
20 全数字的倍数
将192分别与1、2、3相乘:192 * 1 = 192192 * 2 = 384192 * 3 = 576连接这些乘积,我们得到一个1至9全数字的数192384576。我们称192384576为192和(1,2,3)的连接乘积。同样地,将9分别与1、2、3、4、5相乘,得到1至9全数字的数918273645,即是9和(1,2,3,4,5)的连接乘积。对于n > 1,所有某个整数和(1,2, … ,n)的连接乘积所构成的数中,最大的1至9全数字的数是多少?output : 9327原创 2020-08-21 10:26:27 · 498 阅读 · 0 评论 -
19 亲和数
记d(n)为n的所有真因数(小于n且整除n的正整数)之和。如果d(a) = b且d(b) = a,且a ≠ b,那么a和b构成一个亲和数对,a和b被称为亲和数。例如,220的真因数包括1、2、4、5、10、11、20、22、44、55和110,因此d(220) = 284;而284的真因数包括1、2、4、71和142,因此d(284) = 220。求所有小于10000的亲和数的和。分析: 先判断是否是亲和数,然后相加,但要防止加两次。output: 31626public static int原创 2020-08-19 21:44:49 · 439 阅读 · 0 评论 -
BigInteger 大数据类型
1 方法声明public String toString(int radix)radix - 该字符串表示形式的基数(进制),默认值为10,即十进制。返回值:在给定的基数的字符串表示形式异常时,返回 NA// create 2 BigInteger objects BigInteger bi1 = new BigInteger("16"); BigInteger bi2 = new BigInteger("-16"); // create 2 String objects St原创 2020-08-18 09:09:09 · 315 阅读 · 0 评论 -
18 阶乘数字和
n! 的意思是 n × (n − 1) × … × 3 × 2 × 1例如,10! = 10 × 9 × … × 3 × 2 × 1 = 3628800,所以10!的各位数字和是 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27。求出100!的各位数字和。分析:100的阶乘,10进制有157位,基本数据类型存储不下,要自己定义数据类型output: 648public class FactorialDigitSum_18 { public static int factori原创 2020-08-17 22:14:40 · 1708 阅读 · 0 评论 -
17 数星期日
1900年1月1日是星期一。求 二十世纪(1901年1月1日到2000年12月31日)中,有多少个月的1号是星期天?output :171public static int countingSundays() { //1900年1月1日是星期一,那么7号就是星期日 (1900年不是闰年) int sum = 365 - 6; int count = 0; for(int i = 1901; i <=2000; i++) { //i表示年 for(int j =1; j原创 2020-08-16 22:38:47 · 429 阅读 · 0 评论 -
16 最大路径和
从下面展示的三角形的顶端出发,不断移动到在下一行与其相邻的元素,能够得到的最大路径和是23。如下图,最大路径和为 3 + 7 + 4 + 9 = 23。求从下面展示的三角形顶端出发到达底部,所能够得到的最大路径和:分析:其实相当于把一个数组摆成三角形,首先根据行和列计算出在数组中的位置。先计算最底端的,通过往上递归找到最大值。这里的left相当于他左边的那条路径,right相当于他右边的路径。output: 1074在这里插入代码片...原创 2020-08-14 11:21:06 · 255 阅读 · 0 评论 -
15 表达数字的英文字母计数
如果把1到5写成英文单词,分别是:one, two, three, four, five,这些单词一共用了3 + 3 + 5 + 4 + 4 = 19个字母。求 如果把1到1000都写成英文单词,一共要用多少个字母?注意: 不要算上空格和连字符。例如,342(three hundred and forty-two)包含23个字母,115(one hundred and fifteen)包含20个字母。单词“and”的使用方式遵循英式英语的规则。output: 21124方法一publi原创 2020-08-13 10:44:09 · 746 阅读 · 0 评论 -
14 幂的数字和
2^15 = 32768,而32768的各位数字之和是 3 + 2 + 7 + 6 + 8 = 26。求 2^1000的各位数字之和是多少(2的1000次方)?我们知道2的64次方就已经很大了,那么2的1000次方就更大了,常规的算法是不行的,换个思路。2的1000次方,相当于把1往左移动1000位,然后转化为BIgInteger在计算各位数字之和。Math.pow(a, b)//计算a的b次方https://blog.csdn.net/zhang135687/article/details原创 2020-08-11 20:59:41 · 280 阅读 · 0 评论 -
13 网格路径
从一个2×2方阵的左上角出发,只允许向右或向下移动,则恰好有6条通往右下角的路径。求在20×20的方阵,这样的路径有多少条?思路:这个可以通过画图分析,如果等于边的时候只需要一步,如果等于终点的斜对角只需要两步,其他的要递归调用。这个结果虽然是对的,但需要运行好长时间。public class LatticePaths_13 { public static long LatticePaths(int right,int down,int num) { if(right == num ||原创 2020-08-10 21:19:04 · 971 阅读 · 2 评论 -
12 最长考拉兹序列
在正整数集上定义如下的迭代序列:n → n/2 (若n为偶数)n → 3n + 1 (若n为奇数)从13开始应用上述规则,我们可以生成如下的序列:13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1可以看出这个序列(从13开始到1结束)共有10项。尽管还没有被证明,但我们普遍认为,从任何数开始最终都能迭代至1(“考拉兹猜想”)。从小于一百万的哪个数开始,能够生成最长的序列呢?注: 序列开始生成后允许其中的项超过一百万。在这里插入代码片Java中有原创 2020-08-06 21:17:37 · 1029 阅读 · 0 评论 -
11 硬币求和
英国的货币单位包括英镑£和便士p,在流通中的硬币一共有八种:1p, 2p, 5p, 10p, 20p, 50p, £1 (100p), £2 (200p)以下是组成£2的其中一种可行方式:1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p不限定使用的硬币数目,组成£2有多少种不同的方式?分析:通过递归计算,只有相减等于0的时候sum才会加1,否则通过循环递归计算sum的值。output: 73682public class CoinSum_11 { pu原创 2020-08-06 19:01:45 · 333 阅读 · 0 评论 -
10 高度可约的三角形数
三角形数数列是通过逐个加上自然数来生成的。例如,第7个三角形数是 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28。三角形数数列的前十项分别是: 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …让我们列举出前七个三角形数的所有约数:1: 13: 1,36: 1,2,3,610: 1,2,5,1015: 1,3,5,1521: 1,3,7,2128: 1,2,4,7,14,28我们可以看出,28是第一个拥有超过5个约数的三角形数。求第一个拥有超过5原创 2020-08-06 11:11:50 · 433 阅读 · 0 评论 -
9 方阵中的最大乘积
在如下的20×20方阵中,有四个呈对角线排列的数被标红了。这四个数的乘积是26 × 63 × 78 × 14 = 1788696。在这个20×20方阵中,四个在同一方向(从下至上、从上至下、从右至左、从左至右或者对角线)上相邻的数的乘积最大是多少?output:70600674public class FangzhenProduct_9 { public static int max_product() { //创建一个a[20][20]的二维数组 int[][] a = ne原创 2020-08-05 21:19:47 · 255 阅读 · 0 评论 -
8 素数的和
所有小于10的素数的和是2 + 3 + 5 + 7 = 17。求所有小于两百万的素数的和。/* * input: int limit * output: 142913828922 * */public class PrimeSum_8 { //求素数 public static long prime(int limit) { long sum = 0; boolean flag = true; //求limit范围内的所有素数 for(int i=2;i<limi原创 2020-08-05 15:50:02 · 210 阅读 · 0 评论 -
7 特殊毕达哥拉斯三元组
毕达哥拉斯三元组是三个自然数a < b < c组成的集合,并满足a^ + b^ = c^例如,3^ + 4^ = 9 + 16 = 25 = 5^。有且只有一个毕达哥拉斯三元组满足 a + b + c = 1000。求这个三元组的乘积abc。思路: 满足毕达哥拉斯定理,可以把它想象成为一个直角三角形的三条边,a是小的直角边,b是大的直角边,c是斜边。b如果等于a,那么c就是无理数了,相加不可能等于1000,所以b不能等于a。下面的循环要满足直角三角形的几个条件, 1:直角原创 2020-08-05 11:15:26 · 796 阅读 · 0 评论 -
6 连续数字最大乘积
6 连续数字最大乘积在下面这个1000位正整数中,连续4个数字的最大乘积是9 × 9 × 8 × 9 = 5832。731671765313306249192251196744265747423553491949349698352031277450632623957831801698480186947885184385861560789112949495459501737958331952853208805511125406987471585238630507156932909632952274原创 2020-08-04 10:09:04 · 665 阅读 · 0 评论 -
5 第10001个素数
5 第10001个素数 列出前6个素数,它们分别是2、3、5、7、11和13。我们可以看出,第6个素数是13。 求第10,001个素数是多少?public class Sushu10001 { //求素数 public static ArrayList<Integer> prime() { boolean flag = true; ArrayList<Integer> list = new ArrayList<Integer>(); whil原创 2020-08-04 09:12:21 · 551 阅读 · 0 评论 -
4 并非盈数之和
完全数是指真因数之和等于自身的那些数。例如,28的真因数之和为1 + 2 + 4 + 7 + 14 = 28,因此28是一个完全数。一个数n被称为亏数,如果它的真因数之和小于n;反之则被称为盈数。由于12是最小的盈数,它的真因数之和为1 + 2 + 3 + 4 + 6 = 16,所以最小的能够表示成两个盈数之和的数是24。通过数学分析可以得出,所有大于28123的数都可以被写成两个盈数的和;尽管我们知道最大的不能被写成两个盈数的和的数要小于这个值,但这是通过分析所能得到的最好上界。找出所有不能被写成两原创 2020-07-24 21:14:52 · 322 阅读 · 1 评论 -
3 最小倍数
3 最小倍数问题:2520是最小的能够被1到10整除的数。 最小的能够被1到20整除的正数是多少 ?算法思路:其实就是求1到20的最小公倍数,1到n的最小公倍数也是n*(n-1)的倍数,通过不断的乘以n*(n-1)的倍数来判断,如果1到n都能被他整除,则直接返回。public class MinMultiple { public static int MinMultiple(int num) { int product = num * (num-1); int m = 0; for原创 2020-07-23 11:59:00 · 374 阅读 · 1 评论 -
2 最大回文乘积
2 最大回文乘积回文数就是从前往后和从后往前读都一样的数。由两个2位数相乘得到的最大回文乘积是 9009 = 91 × 99。找出由两个3位数相乘得到的最大回文乘积。public class huiwen { public static int bigpalindrome() { int num = 0; for(int i=999;i>0;i--) { for(int j=999;j>0;j--) { int product = i*j; //乘积 i原创 2020-07-22 09:39:59 · 434 阅读 · 1 评论 -
1 最大质因数
1 最大质因数13195的所有质因数为5、7、13和29。600851475143最大的质因数是多少?算法思路:通过不断的递归调用,判断number是否为质数package sushu;import java.util.Scanner;import javax.swing.plaf.synth.SynthLookAndFeel;public class Zhiyinshu2 { public static long primeFactors(long number) { // n原创 2020-07-21 19:08:46 · 226 阅读 · 0 评论 -
求质数与优化
知识点1:System.currentTimeMillis() 计算方式在开发过程中,通常很多人都习惯使用new Date()来获取当前时间。new Date()所做的事情其实就是调用了System.currentTimeMillis()。如果只需要或者毫秒数,那么可使用System.currentTimeMillis() 去代替new Date(),效率上会高一点。如果需要在同一个方法里面多次使用new Date(),通常性能就是这样一点一点地消耗掉,这里其实可以声明一个引用。原文:...原创 2020-07-20 17:25:48 · 124 阅读 · 0 评论