问题引入:
所谓金字塔数,又称走马灯数,也就是142857这个数字,它发现于金字塔内。
它的神奇之处在于:
142857 × 1 = 142857
142857 × 2 = 285714
142857 × 3 = 428571
142857 × 4 = 571428
142857 × 5 = 714285
142857 × 6 = 857142
142857 × 7 = 999999
142857 × 8 = 1142856
142857 × 9 = 1285713
142857 × 10 = 1428570
……
仔细观察所得结果,你会发现所得结果的所有位之和都为27或者27的倍数,而且结果都是由1,4,2,8,5,7或者这五个数字分解组成的(每到星期天,9来代班)。
例如:
142857×9=1285713,1285713由1,2,8,5,7,(1+3)组成,所有位之和为27。
更进一步,2+7=9;
142857×6=857142;
2+7=9;
142857×7=999999;
9×6=54,5+4=9
…
那么问题来了,是不是142857这个金字塔数无论乘多少,所得结果的所有位累加和都满足这种情况呢?
问题描述:
定义一个变量Result=142857*n,由用户输入n(n为任意整数),循环分解出result的每一位,并对每一位进行求和sum,如果sum大于9继续分解,最终判断得到的结果是否为9。
算法简析:
由问题分析得,该问题可以分为三个模块:
- 分解函数,功能是将得到的数字分解成每一位,并保存在数组内
- 求和函数
- main函数,负责调用函数,输出结果
分解函数:
void resolve(int Num[],int n,int result){
if(result>0){
Num[i++]=result%10;
Num[i]=-1;
resolve(Num,n,result/10);
}
else i=0;
}
求和函数:
int Sum(int[] Num,int n){
int sum=0;
while(Num[i]!=-1) sum+=Num[i++];
return sum;
}
完整的程序代码:
package Solution;
import java.util.Scanner;
public class Demo{
private static int i=0;
public static void main(String[] args){
int[] Num=new int[20];
int n=20;
int result;
int sum;
for(int i=0;i<n;i++){
Num[i]=-1;
}
Scanner input=new Scanner(System.in);
System.out.println("please input the N(max:15032):");
int N=input.nextInt();
result=142857*N;
resolve(Num,n,result);
System.out.println("142857*"+N+"="+result);
sum=Sum(Num,n);
System.out.println("累加和:"+sum);
while(sum>9){
resolve(Num,n,sum);
sum=Sum(Num,n);
}
if(sum==9) System.out.println("最终累加和为9");
else System.out.println("Failed");
input.close();
}
//递归分解
static void resolve(int Num[],int n,int result){
if(result>0){
Num[i++]=result%10;
Num[i]=-1;
resolve(Num,n,result/10);
}
else i=0;
}
//求和函数
static int Sum(int Num[],int n){
int sum=0;
int i=0;
while(Num[i]!=-1&&i<n) sum+=Num[i++];
return sum;
}
}
这里,如果单是做这个题的话已经到这已经结束了,但是如果输入的数非常大了,该怎么解决呢?
大数问题在下一篇。