哈沙德数是指在某个固定的进位制当中,可以被各位数字之和整除的正整数。例如 126126 是十进制下的一个哈沙德数,因为 (126)10mod(1+2+6)=0(126)10mod(1+2+6)=0;126126 也是八进制下的哈沙德数,因为 (126)10=(176)8(126)10=(176)8 ,(126)10mod(1+7+6)=0(126)10mod(1+7+6)=0;同时 126126 也是 1616 进制下的哈沙德数,因为 (126)10=(7𝑒)16(126)10=(7e)16 ,(126)10mod(7+𝑒)=0(126)10mod(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 个幸运数字是多少?你只需要告诉小蓝这个整数的十进制表示即可。
#include <stdio.h>
#include <stdlib.h>
int er2(int x)
{
int m = 0;
while (x)
{
m = m + x % 2;
x = x / 2;
}
return m;
}
int ba8(int x)
{
int m = 0;
while (x)
{
m = m + x % 8;
x = x / 8;
}
return m;
}
int shi10(int x)
{
int m = 0;
while (x)
{
m = m + x % 10;
x = x / 10;
}
return m;
}
int shiliu16(int x)
{
int m = 0;
while (x)
{
m = m + x % 16;
x = x / 16;
}
return m;
}
int main()
{
//哈沙德数:用十进制数除以该数的二进制、八进制、十进制、十六进制的各位相加之和能整除
int a;
int sum = 0;//第sum个幸运数字
for (a = 1; ; a++) //从1开始,直到找到第2023个幸运数
{
if ((a % er2(a) == 0) && (a % ba8(a) == 0) && (a % shi10(a) == 0) && (a % shiliu16(a) == 0))
{
sum++;
}
if (sum == 2023)
{
printf("%d", a);
break;
}
}
return 0;
}
经验总结:
ctrl+滑轮:放大缩小代码
x%y==0时,y不能为0,可将y初始化为非零值