Java题目训练——星际密码和数根

目录

一、星际密码

二、数根


一、星际密码

题目描述:

星际战争开展了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)

输出描述:

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

示例

输入:6

           18 15 21 13 25 27

            5

            1 10 100 1000 10000

输出:418109877711037713937811

           00010089410135017501

题目解析:

        该题目有更简单的方法就是找到规律,发现左上角的数是按照斐波那契数列的规律增长的,可以直接根据斐波那契数的规律得出答案,这里给出了这道题目的常规思路,就是按照矩阵相乘的规则,得到每次乘n次方后矩阵左上角的数,对其进行长度判断如果大于4位则取后四位,不足4位则在输出时补0。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[][] x = {{1, 1}, {1, 0}};
        while (scanner.hasNext()){
            int n = scanner.nextInt();
            int[] arr = new int[n];
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < n; i++) {
                arr[i] = scanner.nextInt();
                String temp = Integer.toString(fun(x, arr[i]));
                if(temp.length() < 4){
                    int num = 4 - temp.length();
                    for (int j = 0; j < num; j++) {
                        sb.append("0");
                    }
                }
                sb.append(temp);
            }
            System.out.println(sb);
        }
    }

    public static int fun(int[][] x, int a){
        int[][] x1 = new int[2][2];
        int[][] x2 = new int[2][2];
        int[][] res = new int[2][2];
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                x1[i][j] = x[i][j];
                x2[i][j] = x[i][j];
                res[i][j] = x[i][j];
            }
        }

        for (int i = 1; i < a; i++) {
            res[0][0] = (x1[0][0] * x2[0][0] + x1[0][1] * x2[1][0])%10000;
            res[0][1] = (x1[0][0] * x2[0][1] + x1[0][1] * x2[1][1])%10000;
            res[1][0] = (x1[1][0] * x2[0][0] + x1[1][1] * x2[1][0])%10000;
            res[1][1] = (x1[1][0] * x2[0][1] + x1[1][1] * x2[1][1])%10000;
            for (int j = 0; j < 2; j++) {
                for (int k = 0; k < 2; k++) {
                    x1[j][k] = res[j][k];
                }
            }
        }
        return res[0][0];
    }
}

二、数根

题目描述:

数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根;如果结果是两位数或者包括更多位的数字,那么再把这些 数字加起来。如此进行下去,直到得到是一位数为止。 比如,对于24 来说,把2 和4 相加得到6,由于6 是一位数,因此6 是24 的数根。 再比如39,把3 和9 加起来得到12,由于12 不是一位数,因此还得把1 和2 加起来,最后得到3,这是一个一位数,因此3 是39 的数根。 现在给你一个正整数,输出它的数根。

输入描述:

输入包含多组数据。 每组数据数据包含一个正整数n(1≤n≤10E1000)。

输出描述:

对应每一组数据,输出该正整数的数根。

示例1

输入:24

           39

输出:6

           3

题目解析:

        由于要考虑数字可能会超出范围,这里用了字符串进行相关操作,只要字符串的长度大于1(不是一位),就说明还没求得树根,继续求各位和,再将这个结果赋给字符串继续判断,直到位数为1,求得树根。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()){
            String s = scanner.nextLine();
            System.out.println(numRoot(s));
        }
    }

    public static String numRoot(String s){
        while(s.length() > 1){
            int sum = 0;
            for (int i = 0; i < s.length(); i++) {
                sum += s.charAt(i) - '0';
            }
            s = Integer.toString(sum);
        }
        return s;
    }
}

 如有建议或想法,欢迎一起讨论学习~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值