金字塔数

问题引入:

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

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论

打赏作者

StrongbyTime

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值