题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘输入控制

         * 关键是计算出每一项的值
         * 1、获取n个2
         * 2、累加

本文章你将会获得以下知识:

如何通过累加求和问题转化为Java算法
使用Java实现累加核心功能
适合人群: Java 初级开发

分析

        首先看到题目之后,我们要想到这是一道重复数字长度依次递增累加计算结果的题目,累加数字的最大长度是用户输入的,换句话来说这个值就是一个参数,由用户调用时候输入的,所以对于开始计算的函数而言,其实只有这个重复数字长度这个参数,所以计算方法带有一个参数(这里我们把该参数定义为size),返回值的话可能结果会比较大,所以我们就直接使用Long类型就好了,于是我们基本确定了该方法的入参及其出参。
        在这个方法中,因为重复数字每次长度都会叠加,叠加之后再累加,所以这里面会包含这样几个逻辑:
1、定义一个重复的数字,因为题目中指定是2,所以我们直接定义为固定的变量值就好了;
2、定义一个累加和的变量,初始值为0;
3、需要一个for循环,从1开始,截止到size即可;
4、还需要一个自定义方法(getSameNum),根据重复次数(sum)和重复数字(num)生成需要累加的值。
        到目前为止,我们基本上确定了该方法的具体实现,具体代码如下: 

    public static Long calculate(int size) {
        int num = 2;
        Long sum = 0L;
        for (int i = 1; i <= size; i++) {
            sum = sum + getSameNum(num, i);
        }
        return sum;
    }

        那么目前问题已经成功转化为:通过重复次数(sum)和重复数字(num)生成需要拼接的值
而这里num是确定的2,所以问题进一步转化为:生成sum个num拼接的数值
此时,我们基本确定方法的出入参:

    private static Long getSameNum(int num, int sum) {
            // 实现重复sum次的num值得获取
    }

        当sum = 1时,1个2叠加就是2
        当sum = 2时,2个2叠加就是22 = 2+2*10 = 2*(1+10)
        当sum = 3时,3个2叠加就是222 = 2+2*10+2*100 = 2*(1+10+100) = 2*(10^0^+10^1^+10^2^)
        所以,当sum = sum时,sum个2叠加就是 2*(10^0^+10^1^+10^2^+…+10^sum-1^)
用代码表示即:2*(Math.pow(10, 0)+Math.pow(10,1)+...+Math.pow(10, sum-1))
        因此该方法如下:

    private static Long getSameNum(int num, int sum) {
        long res = 0L;
        for (int i = 0; i < sum; i++) {
            res += 2*(Math.pow(10, i));
        }
        return res;
    }

        这里最简单的办法就是通过字符串来循环拼接num,最终得到一个字符串,再将其转化为数值就好了,代码如下:

    private static Long sameNum(int num, int sum) {
        if (sum == 0) {
            return 0L;
        }
        String s = "";
        for (int i = 1; i <= sum; i++) {
            s += num;
        }
        return Long.parseLong(s);
    }

        总之,将问题转化为代码时,有多重思维方式,大家可以从不同的方向去思考,这样才能扩展我们自身的编程能力。

        到此为止,该题目我们已经实现了,将上述代码聚合一下,我们就可以得到该题目的编程答案,具体代码如下:

/**
 * 重复数字累加
 * 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
 * 关键是计算出每一项的值
 * 1、获取n个2
 * 2、累加
 */
public class RepeatNumCalculate {
    /**
     * 调用入口
     * @param args
     */
    public static void main(String[] args) {
        Long calculate = calculate(3);
        System.out.println(calculate);
    }

    /**
     * 输入重复数字数量计算
     *
     * @param size 重复数字数量
     * @return
     */
    public static Long calculate(int size) {
        int num = 2;
        Long sum = 0L;
        for (int i = 1; i <= size; i++) {
            sum = sum + getSameNum(num, i);
        }
        return sum;
    }

    /**
     * 获取n个2
     *
     * @param num 重复的数字,这里其实就是2
     * @param sum 重复次数
     * @return
     */
    private static Long getSameNum(int num, int sum) {
        long res = 0L;
        for (int i = 0; i < sum; i++) {
            res += 2*(Math.pow(10, i));
        }
        return res;
    }
}

总结

        本套题目难度属于入门级,虽然简单,但是再高难度的题目也是通过这样循序渐进的方法来分步骤实现的,当看到题目时需要学会拆分题目,将题目转化为不同的其它问题,然后再分步骤去实现即可。

        好了,本文章到此就结束了,后续小编会持续更新不同难度的算法题目供大家阅读。

        bye ^  ^

猜你喜欢

转载自blog.csdn.net/m0_37649480/article/details/127018066