关于521
-
描述
-
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>
int a[1000010]={0};
int e[1000010]={0};
int main()
{
int i,j=0,k=0;
int l,p;
int w1=0,w2=0,w3=0;
int c,b;
for(i=125;i<1000000;i++)
{
w1=w2=0;
char s[1010];
w3=0;
sprintf(s,"%d",i);
p=strlen(s);
for(j=0;j<p;j++)
{
if(s[j]=='5')
w1=1;
else if(s[j]=='2')
w2=1;
else if(s[j]=='1')
w3=1;
}
if(w1+w2+w3==3)
{
a[i]=a[i-1]+1;
for(l=0;l<p-2;l++)
{
if(s[l]=='5'&&s[l+1]=='2'&&s[l+2]=='1')
{
e[i]=e[i-1]+1;break;
}
else e[i]=e[i-1];
}
}
else
{
a[i]=a[i-1];
e[i]=e[i-1];
}
}
while(~scanf("%d%d",&b,&c))
{
printf("Case %d:",++k);
printf("%d %d\n",a[c]-a[b-1],e[c]-e[b-1]); //注意是a[i]表示的是前i个书中有多少个生气的数,b---c包括b和c.}
return 0;
}
-
多组测试数据: