幸运数问题,这个该怎么写啊毫无思路,求代码,求思路

明明喜欢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;
}