梅森素数

题目

如果一个数字的所有真因子之和等于自身,则称它为“完全数”或“完美数”
例如:6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
早在公元前300多年,欧几里得就给出了判定完全数的定理:
若 2^n - 1 是素数,则 2^(n-1) * (2^n - 1) 是完全数。
其中 ^ 表示“乘方”运算,乘方的优先级比四则运算高,
例如:2^3 = 8, 2 * 2^3 = 16, 2^3-1 = 7
但人们很快发现,当n很大时,判定一个大数是否为素数到今天也依然是个难题。
因为法国数学家梅森的猜想,我们习惯上把形如:2^n - 1 的素数称为:梅森素数。
截止2013年2月,一共只找到了48个梅森素数。
新近找到的梅森素数太大,以至于难于用一般的编程思路窥其全貌,
所以我们把任务的难度降低一点:
1963年,美国伊利诺伊大学为了纪念他们找到的第23个梅森素数 n=11213,
在每个寄出的信封上都印上了“2^11213-1 是素数”的字样。
2^11213 - 1 这个数字已经很大(有3000多位),
请你编程求出这个素数的十进制表示的最后100位。

代码

 public void process() {BigInteger num = BigInteger.valueOf(2).pow(11213).subtract(BigInteger.ONE);String str = num+"";String answer = str.substring(str.length()-100);System.out.println(answer);}

小结

  1. 看见这种题目臭长的,先到最后看一眼问题

  2. BigInteger类方法

    • valueOf()

      参数是一个long值,返回BigInteger实例

    • pow()

      参数是一个int值,作为指数

    • substract()

      参数是一个BigInteger实例,减法运算

      可以用BigInteger.ONE;BigInteger.TEN;BigInteger.ZERO

  3. 返回字符串str后n位

    String answer = str.substring(str.length()-n);
    

猜年龄

题目

小明带两个妹妹参加元宵灯会。别人问她们多大了,
她们调皮地说:“我们俩的年龄之积是年龄之和的6倍”。
小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过8岁啊。”
请你写出:小明的较小的妹妹的年龄。

代码

 public void process() {for(int i = 1;i < 50;i++) {for(int j = 1;j < 50 ;j++) {if(i * j == (i + j) * 6 && Math.abs(i - j) <=8 && i != j) {System.out.println(i < j ? i : j);//10}}}}

小结

  1. 无趣

啤酒饮料

题目

啤酒每罐2.3元,饮料每罐1.9元。
小明买了若干啤酒和饮料,一共花了82.3元。
我们还知道他买的啤酒比饮料的数量少,
请你计算他买了几罐啤酒。
注意:答案是一个整数。

代码

 public void process() {for(int i = 1;i < 50;i++) {for(int j = i ;j < 50;j++) {if(Math.abs(2.3 * i + 1.9 *j - 82.3) < 0.01) {System.out.println(i);}}}}

小结

  1. 避免浮点数的全等比较

    • 在一定“误差”内比较,数量级小于最小的,如 2.3 --> 0.01
    • 将 2.3 --> 23,扩大到整数再全等比较

武功秘籍

题目

小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的)。
他注意到:书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上。
小明只想练习该书的第81页到第92页的武功,又不想带着整本书。
请问他至少要撕下多少张纸带走?

代码

 public void process() {System.out.println(count(81, 92));}public int count(int a,int b) {int n = 0;while(a != b) {if(a % 2 == 1) n++;a++;}if(a % 2 == 0) n++;return n;}

小结

  1. 无趣

调和级数

题目

1/1 + 1/2 + 1/3 + 1/4 + … 在数学上称为调和级数。
它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字。 但是,它发散的很慢:
前1项和达到 1.0
前4项和才超过 2.0
前83项的和才超过 5.0
那么,请你计算一下,要加多少项,才能使得和达到或超过 15.0 呢?

代码

 public void process() {double c = 0;for(double i = 1.0;;i++) {c += 1 / i;if(c - 15.0 > 0) {System.out.println((int)i);break;}} }

小结

  1. 无趣,再看见普通的遍历就不写了

李白打酒

题目

话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,
已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,
可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。
像这样的答案一共有多少呢?
请你计算出所有可能方案的个数(包含题目给出的)。

代码

 public void process() {fun(5, 10, 2);System.out.println(count);//14}private int count = 0; public void fun(int a,int b,int c) {if(c == 1 && a == 0 && b == 1) count++;if(a >= 0 && b >= 0 && c > 0) {fun(a -1, b, c * 2);fun(a, b-1, c - 1);}}

小结

  1. 比起递归返回一个值 ,我更喜欢用一个成员变量去累加,不用return

猜字母

题目

把abcd…s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
得到的新串再进行删除奇数位置字母的动作。
如此下去,最后只剩下一个字母,请写出该字母。

代码

 public void process() {String str = "abcdefghijklmnopqrs";StringBuilder sb = new StringBuilder();for(int i = 0;i < 106;i++) {sb.append(str);}while(sb.length() > 1){for(int i = 0;i < sb.length();i++) {sb.deleteCharAt(i);}}System.out.println(sb.toString());}

小结

  1. 有个小坑,是 i++,而不是 i += 2

    因为是针对本身删除,所以,删一个后,每个值的索引减 1,故只需 i++

扩散

题目

小蓝在一张无限大的特殊画布上作画。
这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。
小蓝在画布上首先点了一下几个点:(0, 0), (2020, 11), (11, 14), (2000, 2000)。
只有这几个格子上有黑色,其它位置都是白色的。
每过一分钟,黑色就会扩散一点。
具体的,如果一个格子里面是黑色,
它就会扩散到上、下、左、右四个相邻的格子中,
使得这四个格子也变成黑色 (如果原来就是黑色,则还是黑色)。
请问,经过 2020分钟后,画布上有多少个格子是黑色的。

代码

 public void process() {int a[][] =new int[10000][10000];Set<String> hs1 = new HashSet<>();Set<String> hs2 = new HashSet<>();a[5000][5000]=1;        a[5000+2020][5000+11]=1;a[5000+11][5000+14]=1;    a[5000+2000][5000+2000]=1;hs1.add("5000,5000");hs1.add("7020,5011");hs1.add("5011,5014");hs1.add("7000,7000");for (int i = 2; i < 2022; i++) {for (String s : hs1) {String[] arr = s.split(",");int x=Integer.parseInt(arr[0]);int y=Integer.parseInt(arr[1]);if(a[x-1][y]==0){a[x-1][y]=1;hs2.add((x-1)+","+(y));}if(a[x][y-1]==0){a[x][y-1]=1;hs2.add((x)+","+(y-1));}if(a[x+1][y]==0){a[x+1][y]=1;hs2.add((x+1)+","+(y));}if(a[x][y+1]==0){a[x][y+1]=1;hs2.add((x)+","+(y+1));}}hs1.clear();hs1.addAll(hs2);hs2.clear();}int count=0;for (int i = 0; i < 10000; i++) {for (int j = 0; j < 10000; j++) {if(a[i][j]==1) count++;}}System.out.println(count);}

en…还有超时的解法

 public void process() {Set<Cell> set = new HashSet<>();Set<Cell> rep = new HashSet<>();Set<Cell> tmp = new HashSet<>();set.add(new Cell(0, 0));set.add(new Cell(2020, 11));set.add(new Cell(11, 14));set.add(new Cell(2000, 2000));rep.addAll(set);for(int i = 0;i < 2020;i++) {           for(Cell cell : rep) {tmp.add(new Cell(cell.getX() - 1, cell.getY()));tmp.add(new Cell(cell.getX() + 1, cell.getY()));tmp.add(new Cell(cell.getX(), cell.getY() - 1));tmp.add(new Cell(cell.getX(), cell.getY() + 1));}rep.clear();rep.addAll(tmp);set.addAll(tmp);tmp.clear();System.out.println(set.size() + "*");}System.out.println(set.size());}class Cell {private int x;private int y;public Cell(int x,int y) {this.x = x;this.y = y;}public int getX() {return x;}public int getY() {return y;}@Overridepublic int hashCode() {return x * 10 + y;}@Overridepublic boolean equals(Object other) {if(other == this) return true;if(!(other instanceof Cell)) return false;Cell o = (Cell)other;return o.x == x && o.y == y;}}

小结

  1. 在层层扩展中,有用到两个序列,

    一个序列用来存储每次待处理的节点,接受遍历

    另一个序列存储每次扩展出来的节点

    然后来回倒值,使得每次都处理新扩展的节点

  2. 我好想用Hash的去重机制做啊

    在分钟少的情况下,还能出结果,

    但在2020分钟的情况下,却因为要存储千百万个对象而耗时太久

三升序列

题目

对于一个字母矩阵,我们称矩阵中的一个三升序列是指在矩阵中找到三个字母,
它们在同一行,同一列,或者在同一 45 度的斜线上,
这三个字母从左向右看、或者从上向下看是递增的。
例如,如下矩阵中
YQPD
BKEZ
AFYV
有BKZ、BEZ、AFY、AFV、AKP、DEF 等 6 个三升序列。
注意当三个字母是从左下到右上排列时,从左向右看和从上向下看是不同的顺序。
对于下面的 30 行 50 列的矩阵,请问总共有多少个三升序列?
右,右上,左下

代码

    char[][] chs = new char[30][50];int[][] dir = { { 0, 1 }, { 1, 0 }, { 1, 1 }, { 1, -1 }, { -1, 1 } };int cnt = 0;public void init() {try {BufferedReader in = new BufferedReader(new FileReader("src/March/threeIncrease.txt"));String str;int row = 0;while ((str = in.readLine()) != null) {chs[row++] = str.toCharArray();}} catch (Exception e) {}}@Overridepublic void process() {init();int ia, ib, iaa, ibb;for (int i = 0; i < 30; i++) {for (int j = 0; j < 50; j++) {for (int k = 0; k < 5; k++) {ia = i;ib = j;while (true) {ia += dir[k][0];ib += dir[k][1];iaa = ia;ibb = ib;if (ia < 0 || ib < 0 || ia >= 30 || ib >= 50) {break;}while (true) {iaa += dir[k][0];ibb += dir[k][1];if (iaa < 0 || ibb < 0 || iaa >= 30 || ibb >= 50) {break;}if (chs[i][j] < chs[ia][ib] && chs[ia][ib] < chs[iaa][ibb]) {cnt++;}}}}}}System.out.println(cnt);}

小结

  1. 题意不好读,琢磨好方向,得出 int[][] dir
  2. 三个值的选择实现
    • char[i][j]通过两个for循环实现
    • char[ia][ij]char[i][j]确定的基础上,循环5个方向,逐渐累加步长实现
    • char[iaa][ibb]char[ia][ib]确定的基础上,仍沿其方向,逐渐累加步长实现
    • 直到越界,跳出循环

寻找2020

题目

小蓝有一个数字矩阵,里面只包含数字 0 和 2。小蓝很喜欢 2020,他想找到这个数字矩阵中有多少个 2020 。

小蓝只关注三种构成 2020 的方式:
• 同一行里面连续四个字符从左到右构成 2020。
• 同一列里面连续四个字符从上到下构成 2020。
• 在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。

例如,对于下面的矩阵:
220000
000000
002202
000000
000022
002020
一共有 5 个 2020。其中 1 个是在同一行里的,1 个是在同一列里的,3 个是斜线上的。
小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一个文件里面,
在试题目录下有一个文件 2020.txt,里面给出了小蓝的矩阵。
请帮助小蓝确定在他的矩阵中有多少个 2020。

代码

 char[][] chs;public void init() {ArrayList<String> list = new ArrayList<>();try {BufferedReader in = new BufferedReader(new FileReader("src/March/2020.txt"));String str;while((str = in.readLine()) != null) {list.add(str);}in.close();} catch (Exception e) {}chs = new char[list.size()][list.get(0).length()];int i = 0;for(String str : list) {chs[i++] = str.toCharArray();}}@Overridepublic void process() {init();int row = chs.length;int column = chs[0].length;int cnt = 0;for(int i = 0;i < row;i++) {for(int j = 0;j < column;j++) {if(j + 3 < column &&chs[i][j] == '2' &&chs[i][j + 1] == '0' &&chs[i][j + 2] == '2' &&chs[i][j + 3] == '0')cnt++;if(i + 3 < row &&chs[i][j] == '2' &&chs[i + 1][j] == '0' &&chs[i + 2][j] == '2' &&chs[i + 3][j] == '0') cnt++;if(i + 3 < row && j + 3 < column &&chs[i][j] == '2' &&chs[i + 1][j + 1] == '0' &&chs[i + 2][j + 2] == '2' &&chs[i + 3][j + 3] == '0') cnt++;}}System.out.println(cnt);}

小结

  1. 此题是三升序列的的弟弟
  2. 处理文件,确定二维数组的大小处可供参考

梅森素数、猜年龄、啤酒饮料、武功秘籍、调和级数、李白打酒、猜字母、扩散、三升序列、寻找2020相关推荐

  1. 0919作业 猜年龄函数版

    在猜年龄的基础上编写登录.注册方法,并且把猜年龄游戏分函数处理, 登录函数 注册函数 猜年龄函数 选择奖品函数 age = 18 prize_dict = {0: '布娃娃', 1: '变形金刚', ...

  2. 梅森素数--美丽的贝壳

    一.价值五万美元的素数 2000年4月6日,住在美国密歇根州普利茅茨的那扬·哈吉拉特瓦 拉(Nayan Hajratwala)先生得到了一笔五万美元的数学奖金,因为他 找到了迄今为止已知的最大素数,这 ...

  3. 高斯日记、猜年龄、世纪末的星期、排他平方数、马虎的算式、振兴中华、组素数、第39级台阶

    高斯日记 题目 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后 ...

  4. MATLAB判断梅森素数,《枕边算法书》

    <枕边算法书> 这里仅挑一些有意思的故事或知识点做个记录. "红色眼睛与褐色眼睛"谜题 从前,有个小岛上只住着和尚.有些和尚的眼睛是红色的,而另一些则是褐色的.红色眼睛 ...

  5. 魔教《3字魔经》为何优于其它武功秘籍?

    复原魔方6面,有以下几个步骤: 底棱归位,底角归位(底面复原) 中棱归位(第二层复原) 顶棱归位(顶面十字) 顶角面位(顶面复原) 顶棱归位 顶角归位 每一步可以用一个公式完成,学会这6个公式就能复原 ...

  6. Python 实现猜年龄小游戏

    题目如下: 1.用户最多尝试猜测3次 2.尝试3次后,问用户是否还想继续玩,如果回答Y或y,就再给3次机会,提示[还剩最后三次机会],3次都猜错的话游戏结束,如果回答N或n,游戏结束!如果格式输入错误 ...

  7. fft谱分析的误差有哪些原因造成的?如何减小分析误差。_回归分析 | 闯荡数据江湖的武功秘籍...

    社会经济定量研究方法中用到的一些统计步骤分解到一定水平,就将是中心前期相关定量研究主题文章推送的目标: 这方面主要包括了相关关系研究.影响因素研究.综合评价研究.效率及有效性研究.预测.竞争力研究.产 ...

  8. Java黑皮书课后题第6章:**6.28(梅森素数)如果一个素数可以写成2^p-1的形式,其中p是某个正整数,那么这个素数就称作梅森素数。编写程序,找出p≤31的所有梅森素数,然后显示如下结果

    6.28(梅森素数)如果一个素数可以写成2^p-1的形式,其中p是某个正整数,那么这个素数就称作梅森素数.编写程序,找出p≤31的所有梅森素数,然后显示如下结果 题目 题目描述 破题 代码 题目 题目 ...

  9. 2013\Province_Java_C\1.猜年龄

    标题: 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学. 一次,他参加某个重要会议,年轻的脸孔引人注目.于是有人询问他的年龄,他 ...

最新文章

  1. mysql 5.5.38_数据库的硬迁移和mysql 5.5.38源码安装
  2. java拷贝文件权限_boto3 copy vs copy_object关于s3中的文件权限ACL
  3. 团队-科学计算器-模块测试过程
  4. [zz]用U盘装win7/XP系统的操作[图解]
  5. Android官方开发文档Training系列课程中文版:管理设备的睡眠状态
  6. 您为了什么而学?【一入红尘深似海 勿负天下有心人】
  7. C#AE创建FeatureDataset/创建数据、集要素集
  8. Java中9种IO的读取方式
  9. 金额数字转中文大写(转)
  10. html打印标签多了一页,webpack打包多页应用,如何处理不同html页面(通过a标签)之间的跳转?...
  11. autojs toast 可以改变字体颜色吗_喃喃札记 | 你真的需要一部pad做笔记吗?
  12. 构造方法内的多态问题
  13. UVA 299 - Train Swapping(冒泡排序)
  14. GsonFormat的使用 (转)
  15. mysql监视执行sql语句_监控mysql执行的sql语句
  16. 微信公众平台系列-7拓展(如何使用微信扫一扫登录自己的网站)
  17. 功率放大芯片IR2184介绍
  18. win10访问服务器文件夹慢,win10系统访问共享文件夹速度特别慢的操作方法
  19. 【PM】你的团队可能会出现可怕的“死海效应”
  20. adb教程(很详细)

热门文章

  1. Java8种Stream流相关操作——集合的筛选、归约、分组、聚合
  2. 麒麟系统arm64或aarch64架构下docker打包jdk1.8镜像
  3. 本周大新闻|华为发布BB观影眼镜,Geenee AR试穿加入AI生成玩法
  4. 大数据开发面试题总结-超详细
  5. int a是神么意思
  6. “创意云”大规模在线创作服务平台
  7. Mysql莫名其妙的错误,语法没错却报语法错误
  8. 【系统】【winget】从零开始配置一个开发用的 Windows 11 系统的电脑 - winget 代码终端安装软件
  9. 【Python】 将图片绘制到Excel表格中
  10. 游戏体验之穿越火线手游