背景
几天前笔者在做Java编程题的时候,遇到了这样一道题:
求 s=a+aa+aaa+aaaa+aa…a 的和,其中a是一个数字,例如2+22+222+2222+2…2 最大有几个2由键盘录入得到 例如提示用户 请输入你要求和的数字 用户输入的是3 请输入你要的最大的数字个数 用户输入的是5 那么就是求 3+33+333+3333+33333 的和 请编写程序实现。
相信网上已经有不少这个题的答案,所以写这篇博客,是为了为大家提供一个作为初学者面对这道题的可能不太一样的思路。
笔者看到这道题的思路
如题干中所示,一共需要输入两个数字,第一个是需要求和的数字,第二个是数字最多的个数,例如,第一次输入5,第二次输入3,则求的是5+55+555的和。不难可以看出,不论输入的是几, 最后都可转化为1+11+1…1的和(最多的1的数目取决于第二次输入的数字)再乘以第一次输入的数字。于是这个问题就分解成了:(1)用键盘输入一个数字,求出1+11+1…1(定为a式)(最多的1的数目取决于输入的这个数字)的和(2)用1中的结果再乘以一个之前输入好的数字。显然,问题二对于初学者来说很好解决,我们只需要解决问题(1)。
不难看出,问题(1)又可分解为,(1)+(1+10)+(1+10+100),即100+(100+101),以此类推,到这里,这个问题就成了乘方再相加的问题了。(注,Java的math类中有求乘方的方法,有兴趣可自行查询)对于对math类接触不多的初学者来说,现在唯一的问题就是求10的乘方的问题,由于我们只需要求10的几次方,所以构造一个方法,用循环就可以很好的解决这个问题。
解决10的乘方的方法参考代码:
public static int show(int a) {
if (a == 0) {
return 1;
}
else {
int aa = 1;
while (a != 0) {
aa = aa * 10;
a--;
}
return aa;
}
}
次方法对于初学者来说比较便于理解。
解决了这个问题之后,其他的问题对初学者来说就不是什么难事了。
参考代码
package org.mytesedemo;
import java.util.Scanner;
public class mytese1 {
public static void main(String[] args) {
int sum=0;
int sum1=0;
int sum2=0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要求和的数字");
int a=sc.nextInt();
System.out.println("请输入最长数字的个数");
int b=sc.nextInt();
for (int i = 1; i <= b; i++) {
sum=sum+show(i-1);//得出1,11,111
sum1=sum+sum1;//求出1,11,111等数相加的和
}
sum2=sum1*a;//求出最后结果
System.out.println(sum2);
}
public static int show(int a) {
if (a == 0) {
return 1;
}
else {
int aa = 1;
while (a != 0) {
aa = aa * 10;
a--;
}
return aa;
}
}
}
运行结果:
请输入你要求和的数字
5
请输入最长数字的个数
5
61725