列表

详情


OR134. 幸运数字

描述

小雅同学认为6,8是她的幸运数字,而其他数字均不是,一个幸运数是指在十进制表示下只含有幸运数字的数。给定你一个区间(a,b)a和b之间(其中包括a和b幸)运数的个数。

输入描述

输入两个整数a和b,a的取值范围在1和1000000000之间(其中包括1和1000000000),b的取值范围在a和1000000000之间(其中包括a和1000000000)。

输出描述

返回a和b之间的幸运数个数,如果入参不合法,请输出-1

示例1

输入:

1 10

输出:

2

说明:

6,8,6666,88888,6668888,68686688均为幸运数字,当a=1,b=10函数返回值为2。

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 232KB, 提交时间: 2019-01-15

#include<stdio.h>
#include<stdlib.h>

int a;
int b;
int count = 0;

int intlen(int num)
{
	int i=0;
	while(num)
	{
		num/=10;
		i++;
	}
	return i;
}

void foo(char cs[], int index,int len)
{
	if(len>=10)
	{
		return;
	}
	if (index == len)
	{
		int num = atoi(cs);
		if (num >= a && num <= b)
		{
			count++;
		}
		return;
	}
	for (int i = 0; i < 2; i++)
	{
		if (i == 0)
		{
			cs[index] = '6';
		}
		else
		{
			cs[index] = '8';
		}
		foo(cs, index + 1, len);
	}
}

int main()
{
	scanf("%d",&a);
	if (a < 1 || a > 1000000000)
	{
		printf("-1\n");
		return 0;
	}
	scanf("%d",&b);
	if (b < a || b > 1000000000)
	{
		printf("-1\n");
		return 0;
	}

	int lenA = intlen(a);
	int lenB = intlen(b);
	for (int i = lenA; i <= lenB; i++)
	{
		char cs[i];
		foo(cs, 0, i);
	}
	printf("%d\n",count);

	return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 304KB, 提交时间: 2021-09-20

#include <stdio.h>
#include <math.h>
#include <stdbool.h>

void f(int a,int b,int arr[])
{
    for(int i=0,j=2;arr[j-1]<=b;i++)
    {
        arr[j++]=arr[i]*10+6;
        arr[j++]=arr[i]*10+8;
    }
}

int main()
{
    long long int a,b;
    while(scanf("%lld %lld",&a,&b)!=EOF)
    {
        if(a<1 || b<1 || b<a || a>1000000000 || b>1000000000)
        {
            printf("%d\n",-1);
            continue;
        }
        int arr[10000]={6,8};
        f(a,b,arr);
        int i=0,sum=0;
        while(arr[i]<=b)
        {
            if(a<=arr[i] && arr[i]<=b)
                sum++;
            i++;
        }
        printf("%d\n",sum);
    }
    return 0;
}

上一题