幸运数字-蓝桥杯

问题描述

哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整数。例如 126126 是十进制下的一个哈沙德数,因为 (126)10mod(1+2+6)=0(126)10​mod(1+2+6)=0;126126 也是八进制下的哈沙德数,因为 (126)10=(176)8(126)10​=(176)8​ ,(126)10mod(1+7+6)=0(126)10​mod(1+7+6)=0;同时 126126 也是 1616 进制下的哈沙德数,因为 (126)10=(7e)16(126)10​=(7e)16​ ,(126)10mod(7+e)=0(126)10​mod(7+e)=0。小蓝认为,如果一个整数在二进制、八进制、十进制、十六进制下均为哈沙德数,那么这个数字就是幸运数字,第 11 至第 1010 个幸运数字的十进制表示为:1,2,4,6,8,40,48,72,120,126…1,2,4,6,8,40,48,72,120,126…。现在他想知道第 20232023 个幸运数字是多少?你只需要告诉小蓝这个整数的十进制表示即可。

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

ps:解题代码非原创,来自 “yc” ,本文仅提供思路讲解和易错点提示

//首先通过问题分析,将代码分为遍历和判断两部分
public class test {
	public static void main(String[] args) {
		int a=0;//定义一个数用于接收是第几个幸运数字
		for (int i = 1; ; i++) {//空出条件实现无限循环
			if(chack(i, 2)&&chack(i, 8)&&chack(i, 10)&&chack(i, 16)) {//调用定义的方法检查i是否为幸运数字
				a++;//是,幸运数字个数加一
				}
			if(a==2023) {//如果为第2023个
				System.out.println(i);
				break;//退出循环
			}
		}				
	}
//定义一个方法用于检查i是否为幸运数字
//1.确认返回值(boolean)2.确认参数(i即为待确认数字,mod就是 是几进制)
	public static boolean chack(int i,int mod) {
		int nc=0;//定义一个数接收余数和
		int c=i;//i会在下面的循环中改变,所以定义一个数代替i用于最后的判断
		while (i>0) {//得出i的余数和
			nc=nc+i%mod;
			i=i/mod;
		}		
		return c%nc==0;//判断是否为幸运数字
	}
}

这个解法的核心思路就是进制的准换来获取转换后的每一位数,原理可看

http://t.csdnimg.cn/4c4xu(进制准换方法)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值