2024年第十五届蓝桥杯大赛软件类省赛C/C++大学B组真题——好数

题目:一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位 · · · )上的数字是奇数,偶数位(十位、千位、十万位 · · · )上的数字是偶数,我们就称之为“好数”。给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。

由于题目中最高只有七位数,可以通过多少位数来分别判断:

#include

int main()
{
    int  num1, count = 0, n = 0;
    scanf("%d", &num1);
    
    for (int num = 1; num <= num1; num++)
    {
        int num2 = num;
        while (num2)
        {
            num2 /= 10;
            count++;
        }
        if (count == 1)
        {
            if (num % 2 != 0) n++;
        }
        else if (count == 2)
        {
            if ((num % 10) % 2 != 0 && (num / 10) % 2 == 0) n++;
        }
        else if (count == 3)
        {
            if ((num % 10) % 2 != 0 && ((num / 10) % 10) % 2 == 0 && (num / 100) % 2 != 0) n++;
        }
        else if (count == 4)
        {
            if (num % 10 % 2 != 0 && num / 100 % 2 != 0 && num / 10 % 10 % 2 == 0 && num / 1000 % 2 == 0) n++;
        }
        else if (count == 5)
        {
            if (num % 10 % 2 != 0 && num / 100 % 10 % 2 != 0 && num / 10000 % 2 != 00 && num / 10 % 10 % 2 == 0 && num / 1000 % 10 % 2 == 0) n++;
        }
        else if (count == 6)
        {
            if (num % 10 % 2 != 0 && num / 100 % 10 % 2 != 0 && num / 10000 % 10 % 2 != 0 && num / 10 % 10 % 2 == 0 && num / 1000 % 10 % 2 == 0 && num / 100000 % 2 == 0) n++;
        }
        else
        {
            if (num % 10 % 2 != 0 && num / 100 % 10 % 2 != 0 && num / 10000 % 10 % 2 != 0 && num / 1000000 % 10 % 2 != 0 && num / 10 % 10 % 2 == 0 && num / 1000 % 10 % 2 == 0 && num / 100000 % 2 == 0) n++;
        }
        count = 0;
    }
    printf("%d", n);
    return 0;
}

但是这种方法耗时耗力,我们可以一位一位去判断:

int main()

{

    int a, i, x, num, sum = 0;

    scanf("%d", &num);

    for (i = 1; i <= num; i++)                               //i=0不是好数,故从i=1开始

    {

        x = i;

        while (x != 0)                                             //while循环来判断是否为好数

        {

            a = x % 10;

            if (a % 2 != 0)                                          //个位是奇数则舍去个位,循环继续

            {

                x /= 10;

            }

            else                                                         //个位不是奇数,本次循环结束

            {

                break;

            }

            if ((x % 10) % 2 == 0 )                //判断第二位是否为偶数,是则循环继续

            {

                x /= 10;

            }

            else                                                            //第二位不是偶数本次循环结束

            {

                break;

            }

        }

        if (x == 0)                                                      //while循环结束若x==0则循环正常结束了,得到一个好数,用sum来计数

        {

            sum++;

        }

    }

    printf("%d", sum);                                            //最后打印区间范围内好数的个数

    return 0;

}

分别判断每一位数是否符合条件。

你可能感兴趣的:(蓝桥杯,c语言,c++)