qq_40738424
2019-10-24 10:41
采纳率: 66.7%
浏览 1.0k

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • tdnexhx 2019-10-24 11:58
    已采纳

    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范围内所有的质数
    然后把这个范围内所有的幸运数、近似幸运数从数组里标记掉,再统计剩下的
    如果内存不允许,那么挨个计算,可能会比较慢

    点赞 打赏 评论
  • 强仔! 2019-10-24 11:04

    C++我不会,我说下我的思路你看看自己能不能写出来
    先判断区间的长度 count([1,1000])
    用foreach循环对每一个长度区间内的值进行判断
    用字符判断,数字中是否含有7 如果有 I++
    用余数判断。数字能被7整除 如果有J++
    判断J 和I 中是否有元素是相同的 进行减运算
    判断 count-i-j >0

    点赞 打赏 评论
  • 卧_听风雨 2019-10-24 11:42

    图片说明

    伪幸运数函数修改一下就好了:

    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;
    }
    
    点赞 打赏 评论
  • 斗酒神僧 2019-10-26 19:28
    
    #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;
    }
    
    点赞 打赏 评论

相关推荐