杭电oj HDOJ 2089 不要62

杭电oj HDOJ 2089 不要62

Problem Description

杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。

Input

输入的都是整数对n、m(0

Output

对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。

解题思路

本来的思路是把接收到的数字利用“stringstream类”变成字符串,然后用C++中字符串的自带查找函数来看是不是有“62”或“4”,但是尝试了之后平台提示超时。所以后来考虑直接使用“/”和“%”来从后向前检查每一位(或每两位)是否为“62”或“4”

本人的C++解决方案

#include 
using namespace std;

int main()
{
	int m, n, i, temp, s;
	bool num[999999];
	for (i = 0; i < 999999; i++) {
		num[i] = false;
	}
	for (i = 0; i < 999999; i++) {
		temp = i + 1;
		// 从该数的个位开始向前查看是否存在“4”或“62”
		while (temp > 0) {
			if (temp % 10 == 4 || temp % 100 == 62) {
				num[i] = true;
				break;
			}
			temp /= 10;
		}
	}
	while (cin >> n >> m) {
		if (m == 0 || n == 0) {
			break;
		}
		if (m < 0 || n < 0 || m >= 1000000 || n >= 1000000 || n > m) {
			continue;
		}
		s = 0;
		for (i = n; i <= m; i++) {
			if (num[i - 1] == false) {
				s++;
			}
		}
		cout << s << endl;
	}
	return 0;
}

代码通过HDOJ平台运行检查,如发现错误,欢迎指出和纠正,谢谢!

你可能感兴趣的:(杭电oj HDOJ 2089 不要62)