【编程题 】星际密码(详细注释 易懂)

题目描述

题目链接:星际密码__牛客网
     星际战争开展了100年之后,NowCoder终于破译了外星人的密码!他们的密码是一串整数,通过一张表里的信息映射成最终4位密码。表的规则是:n对应的值是矩阵X的n次方的左上角,如果这个数不足4位则用0填充,如果大于4位的则只输出最后4位。
|1 1|^n => |Xn ..|
|1 0|      |.. ..|
例如n=2时,
|1 1|^2 => |1 1| * |1 1| => |2 1|
|1 0|      |1 0|   |1 0|    |1 1|
即2对应的数是“0002”。

输入描述:

输入有多组数据。
每组数据两行:第一行包含一个整数n (1≤n≤100);第二行包含n个正整数Xi (1≤Xi≤10000)

输出描述:

对应每一组输入,输出一行相应的密码。

示例1

输入

6
18 15 21 13 25 27
5
1 10 100 1000 10000

输出

418109877711037713937811
00010089410135017501

题目解读:

    这道题难度是 两星,但我不得不抨击,这道题难度应该是四星,它的难度在题意理解上,基本上十个人 ,八个人读不懂,还有两个有点懵,你说这是两星,是不是很可笑。 

     首先,矩阵X 具体是 什么矩阵,它不说里面有啥?  然后,说的是 矩阵左上角 数保留后四位,它的示例里面 输出的结果 那都不知道多少位 ? 最后,题目里面说的是 矩阵X的 n次方的左上角的值,你输入说明里,却还给了 后面n个值,这n个值,是放矩阵里面还是干嘛的?  以上三个问题,它统统没说清楚,让我们猜,只能说 混蛋题目。

    那现在解释一下,它到底说了个什么意思。首先,就是给一个 固定的 矩阵,里面就是 

|1 1|
|1 0|  ,就是它,用它不断和自己相乘,然后乘积继续和它相乘,n 就是相乘的次数,矩阵相乘公式如下,

   

 就是A矩阵的第一行乘以 B矩阵的第一列,得到 乘积矩阵的 第一个值,然后A矩阵的第一行乘以 B矩阵的第二列,得到乘积矩阵的 第一行第二列的值,下同。  

   由于我们只拿乘积矩阵的左上角那个值,所以我们就试着计算了几个矩阵,发现 左上角值,随着n的变大,呈现 斐波那契数列的关系。  也用公式推了下,如下,

 【编程题 】星际密码(详细注释 易懂)_第1张图片

       然后说第二个问题,为什么输出有那么多位,因为它把多个n值的四位结果按顺序粘连在一起了,你以为给的是整数,输出就是整数? 不,输出其实是个字符串。

    第三个问题,为什么n 后面还要给 n 个整数,是往 矩阵里面放的吗? 不是,它是每次运算矩阵乘方的次数,比如 n 是2 ,后面 给出 15  , 24 ,它表示,先计算矩阵的 15次方的左上角值,取后四位,然后计算矩阵的24次方,取左上角值的后四位,把这两个后四位粘连起来,就得到最终结果。

解题思想:

     上面题目解读说的明确了,解题思想也就很好说了,首先它说 给的n个数的数值范围最大是 10000,那我们就 计算1 到 10000的 斐波那契数列,为了下标与 给出的n值匹配,我们数组给个 10001,然后 数组第一项是 1,第二项是 2,迭代计算出每一项,同时计算出来后,我们只取后四位,如何取呢, 可以给它 模上 10000,10000是五位数,对它求余(或者取模),就可以拿到后四位,然后把这个后四位再存放到数组中。 然后用一个字符串,粘连每个从数组中取出的四位数, 如果不足四位用 0 填充,这个可以用 字符串的 格式化函数达到。

代码注释:

// write your code here
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int[] fibonacci = new int[10001];
        fibonacci[1]=1;
        fibonacci[2] =2;
        for(int i=3;i<= 10000;i++){
            fibonacci[i]=fibonacci[i-1]+fibonacci[i-2];
            fibonacci[i] %= 10000;
        }
       
        while(scan.hasNextInt()){
            int n = scan.nextInt();
            String password = "";
            for(int i=0;i

你可能感兴趣的:(笔试刷题(详细注释,小白易懂),java,算法,数据结构)