nyoj975关于521

写了大概四个小时吧, 刚开始是对某个数n它的anger和anger2都存起来, 在从a到b相加, TL了n次, 看了一下讨论区, 原来还可以将每一个数之前的总结出来(我咋没想起来呢, 笨死我算了 )
代码:

/*
描述
Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去。
浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字,顿时觉得好浪漫,因为每个男生都会不经意的成为浪漫的制造者。此后,流年走到哪里都能看到5、2、1三个数字,他怒了,现在他想知道在连续的数中有多少数全部包含了这三个数字。例如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];
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()
{
// memset(anger, 0, sizeof(anger) );
// memset( anger2, 0, sizeof(anger2) );
find();
int a, b, h = 1;
while( scanf( "%d%d", &a, &b ) == 2 )
{
printf( "Case %d:", h );
++h;
printf( "%d %d\n", anger[b]-anger[a-1], anger2[b]-anger2[a-1] );
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值