* 关键是计算出每一项的值
* 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 ^ ^