NYOJ975

描述

Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去。

浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字,顿时觉得好浪漫,因为每个男生都会不经意的成为浪漫的制造者。此后,流年走到哪里都能看到521三个数字,他怒了,现在他想知道在连续的数中有多少数全部包含了这三个数字。例如12356就算一个,而5111就不算。特别的,如果他看到了521三个数连续出现,会特别的愤怒。例如35210

输入
多组测试数据:
一行给定两个数a,b(0<a,b<1000000),表示数字的开始和结束。
输出
一行显示他想要知道的数有几个及显示有多少个数字令他特别的愤怒。用空格隔开。
样例输入
200 500
300 900
1 600
样例输出
Case 1:2 0
Case 2:2 1
Case 3:6 1


#include<stdio.h>
#include<string.h>
#define MAXN 1000000
int anger[MAXN], anger2[MAXN];
int s[10];
//枚举1000000以内所有的整数,最后查表
void find(){
	int x, y, z, j, i, n, m;
	for( j = 125; j < MAXN; j ++ ){
		m = 0;
		x = y = z = 1;
		s[0] = j % 10;
		s[1] = j / 10 % 10;
		s[2] = j / 100 % 10;
		s[3] = j / 1000 % 10;
		s[4] = j / 10000 % 10;
		s[5] = j / 100000 % 10;
			for(  i =0; i < 4; i ++ ){
				if( s[i] ==1&&s[i+1] ==2&&s[i+2] == 5 ){
					anger2[j] = anger2[j-1]+1;
					break;
				}
				if(  i == 3 ) //不符合条件
				anger2[j] = anger2[j-1]; 
			}
				for( i = 0; i < 6; i ++ ){
				if( x&&s[i]==1 ) 
					++m, x = 0;
				if( y&&s[i] ==2 )
					++m, y = 0;
				if( z&&s[i] == 5 )
					++m, z = 0;
				} 
				if( m == 3 )
					anger[j] =anger[j-1]+1;
				else
					anger[j] = anger[j-1];
	}  
}
int main(){
	find();
	int a, b, kase = 1;
	while( scanf( "%d%d", &a, &b ) == 2 )
		printf( "Case %d:%d %d
",  kase++,anger[b]-anger[a-1], anger2[b]-anger2[a-1] );//用a,b框定范围,find()中存在两个范围中的数值是从125(第一个)开始知道这个一共有几个这样的数字。
	return 0;
}





原文地址:https://www.cnblogs.com/gwj1314/p/9444964.html