金字塔数

    xiaoxiao2021-12-14  22

    问题引入:

    所谓金字塔数,又称走马灯数,也就是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; } }

    这里,如果单是做这个题的话已经到这已经结束了,但是如果输入的数非常大了,该怎么解决呢? 大数问题在下一篇。

    转载请注明原文地址: https://ju.6miu.com/read-962736.html

    最新回复(0)