明明喜欢7这个数字,如果一个数的十进制表示中含有7,则该数为明明的幸运数。例如7,78,17都是幸运数,而168不是幸运数。
如果一个数能够被幸运数整除,则称之为近似幸运数。例如14能被7整除,是一个近似幸运数。
现给定两个正整数,请输出这个区间内(含区间首尾)既不是幸运数也不是近似幸运数的那些数的数量;如果不存在,则输出0。
输入描述
输入两个整数a, b。
输出描述
输出为一个数,表示[a, b]区间中既不是幸运数也不是近似幸运数的数的数量。
注释
【数据范围】
50%的数据满足:1 <= a,b <= 10,000
100%的数据满足: 1 <= a,b <= 1,000,000
C++代码如下
#include 《string》
#include 《vector》
void main()
{
// TODO: Place code here.
std::vector arrLuck; // 记录幸运数
std::vector arrOther;
std::vector arrLuck2; // 记录伪幸运数
int A = 0;
int B = 100;
char sNum[10];
for (int i = A; i < B; i++) // AB是定义的区间
{
sprintf(sNum,"%d",i);// 数字转换为字串,字符换查询是否有7
if (strchr(sNum,'7')!=NULL)
arrLuck.push_back(i); //包含幸运数7,记录下
else
arrOther.push_back(i);
}
for (i = 0; i < arrOther.size(); i++)
{
int a = arrOther[i];
for (int j = 0; j < arrLuck.size(); j++)
{
if (a % arrLuck[j] == 0) // 能被幸运数整除,则为伪幸运数
{
arrLuck2.push_back(a);
break;
}
}
}
int result = (B - A) - arrLuck.size() - arrLuck2.size(); // 总数-幸运数-伪幸运数
printf("result = %d\r\n", result);
}
运行输出62 就是答案
其中2头文件为 《》 替换为<>
如果内存允许,最简单的办法,是定义一个1,000,000大小的数组,计算1,000,000/7范围内所有的质数
然后把这个范围内所有的幸运数、近似幸运数从数组里标记掉,再统计剩下的
如果内存不允许,那么挨个计算,可能会比较慢
C++我不会,我说下我的思路你看看自己能不能写出来
先判断区间的长度 count([1,1000])
用foreach循环对每一个长度区间内的值进行判断
用字符判断,数字中是否含有7 如果有 I++
用余数判断。数字能被7整除 如果有J++
判断J 和I 中是否有元素是相同的 进行减运算
判断 count-i-j >0
伪幸运数函数修改一下就好了:
bool isSimilarLuckyNum(const int& b)
{
int MaxNum = b / 2 + 1;
for (int i = 0; i < MaxNum; i++)// 遍历 (b/2 +1)内的每个幸运数,在(b/2 +1)之上的就没必要了
{
if (isLuckyNum(i))// i为幸运数
{
if ((b%i) == 0)// b 为 伪幸运数
return true;
}
}
return false;
}
#include <math.h>
bool IsLuckyNumber(int number)
{
int n = number;
while (n != 0 && n % 10 != 7)
n = n / 10;
return n != 0 ? true : false;
}
int CountNumbers(int a, int b)
{
int count = 0;
for (int num = a; num <= b; ++num)
{
if (!IsLuckyNumber(num))
{
int limit = (int)sqrt(num);
bool isSimilarLuckyNumber = false;
for (int i = 2; i <= limit; ++i )
{
if (num % i == 0 && (IsLuckyNumber(i) || IsLuckyNumber(num / i)))
{
isSimilarLuckyNumber = true;
break;
}
}
if (!isSimilarLuckyNumber)
++count;
}
}
return count;
}
int main()
{
int a = 1, b = 1000000;
int count = CountNumbers(a, b);
return 0;
}