③【Java 组】蓝桥杯省赛真题 [黄金连分数][马虎的算式]持续更新中...

简介: ③【Java 组】蓝桥杯省赛真题 [黄金连分数][马虎的算式]持续更新中...


一、黄金连分数(填空)


题目描述

文字版:

黄金分割数 0.61803… 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。

对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!

言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。

比较简单的一种是用连分数:

1
    黄金数 = ---------------------
                        1
             1 + -----------------
                          1
                 1 + -------------
                            1
                     1 + ---------
                          1 + ...

这个连分数计算的“层数”越多,它的值越接近黄金分割数。

请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后 100 位。

小数点后3位的值为:0.618;

小数点后4位的值为:0.6180;

小数点后5位的值为:0.61803;

小数点后7位的值为:0.6180340。 (注意尾部的 00,不能忽略)

你的任务是:写出精确到小数点后 100 位精度的黄金分割值。

注意:尾数的四舍五入! 尾数是 0 也要保留


解题思路

根据题目给到黄金数的连分数示意图,我们可以发现,相邻层级之间的数是有关联的:

① 黄金数的分母 = 上一层数 分母+分子

② 黄金数的分子 = 上一层数分母

而分子以及分母的变化,恰巧就是斐波那契数列,那么我们就将问题转换成了求斐波那契额相邻两个数的比值。

同时题目要求写出精确到小数点后 100 位精度的黄金分割值,浮点数已经无法满足如此多的小数位,所以需要使用使用BigInteger和BigDecimal。


解题代码:

import java.math.BigDecimal;
import java.math.BigInteger;
//求斐波那契额相邻两个数的比值,需要保证小数点后101位准确,使用BigInteger和BigDecimal
public class 黄金连分数 {
  public static void main(String[] args) {
    BigInteger a = BigInteger.ONE; //a代表分子
    BigInteger b = BigInteger.ONE; //b代表分母
    for(int i = 3;i < 500;i++) { //第一层是 1/1 (已知),所以从第三个数开始
      BigInteger temp = b;
      b = a.add(b);       //黄金数的分母 = 上一层数 分母+分子
      a = temp;           //黄金数的分子 = 上一层数分母
    }
    //创建BigDecimal对象,小数点没有限制;
    //divide()方法表示除法运算
    BigDecimal divide = new BigDecimal(a,110).divide(new BigDecimal(b,110),BigDecimal.ROUND_HALF_DOWN);
    //输出黄金分割数,精确到101位(103代表字符数,包含0和.)
    System.out.println(divide.toPlainString().substring(0,103));
    //0.61803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748
    //小数点后101位,我们需要四舍五入至100位
    //0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375
  }
}
答案:0.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375





二、马虎的算式(填空)


题目描述

文字版:

小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

有一次,老师出的题目是:36x495=?

他却给抄成了:396x45=?

但结果却很戏剧性,他的答案竟然是对的!!

因为 36∗495=396∗45=17820。

类似这样的巧合情况可能还有很多,比如:27∗594=297∗54。

假设 a b c d e 代表 1 ~ 9 不同的 5 个数字(注意是各不相同的数字,且不含 0 )

能满足形如: ab∗cde = adb∗ce 这样的算式一共有多少种呢?

请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。

满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。


解题思路

根据题目要求,遍历所有数字组合,找到符合条件算式时,种类数+1即可。


解题代码:

public class 马虎的算式 {
  public static void main(String[] args){
    int count = 0;  //记录种类数
    //数字1~9随机,故遍历所有循环,abcde间的所有数字可能,则需要不断嵌套循环
    for(int a = 1;a < 10;++a) {
      for(int b = 1;b < 10;++b) {
        //循环前进行判断,保证是各不相同的数字
        if(a != b) for(int c = 1;c < 10;++c) {
          if(a != c && b!= c) for(int d = 1;d < 10;++d) {
            if(a != d && b != d && c != d) for(int e = 1;e < 10;++e) {
              if(a != e && b != e && c != e && d != e)
                //如果 ab∗cde = adb∗ce
              if((a*10 + b ) * (c*100+d*10+e) == (c*10 + e ) * (a*100+d*10+b))
                //数量+1
                ++count;
            }
          }
        }
      }
    }
    System.out.print(count);
  }
}





目录
相关文章
|
6月前
|
Java
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
53 4
|
6月前
|
Java
蓝桥杯Java组暴力递归搜图
蓝桥杯Java组暴力递归搜图
34 4
|
6月前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
49 3
|
6月前
|
Java
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
51 2
|
6月前
|
Java
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
39 1
|
6月前
|
Java
2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
44 1
|
6月前
|
Java
2021蓝桥杯大赛软件类省赛Java大学B组 时间显示
2021蓝桥杯大赛软件类省赛Java大学B组 时间显示
35 0
2021蓝桥杯大赛软件类省赛Java大学B组 时间显示
|
6月前
|
存储 前端开发 算法
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
38 0
|
6月前
|
算法 Java 编译器
第十五届蓝桥杯Java软件开发大学B组自我经验小结
第十五届蓝桥杯Java软件开发大学B组自我经验小结
55 0
|
6月前
|
Java API
备战第十五届蓝桥杯Java软件开发大学B组常见API记录
备战第十五届蓝桥杯Java软件开发大学B组常见API记录
44 0
下一篇
DataWorks