关于521



1000 ms  |  内存限制: 65535


2



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



题解:这道题输入多组数据,如果每一组都重新计算的话必定超时。所以只能先计算整个范围内的值,比如arr[1000000] ,arr[i]是0到i共有几个含有同时1.2.5的数。这样当程序获取输入值a,b后。同时含有1,2,5的数的数量为arr[b]-arr[a-1];含有连续的521的也是同理。

 

程序代码:

#include<stdio.h>
#include<string.h> 
#include<stdlib.h> 
 
int arr[1000000];
int arr2[1000000];
 
int main()
{
  long inta,b,i=1,t,k,flag1,flag2,flag5,x,y,m;//long int:编译器分配给long数据4个字节
  arr[0]=0;
  arr2[0]=0;
 for(t=1;t<1000000;++t)
  {
   arr[t]=arr[t-1];
   flag1=flag2=flag5=0;
    m=t;
    while(m>0)
    {
      k=m%10;
      m=m/10;
      if(k==1)
        flag1=1;
      else if(k==2)
        flag2=1;
      else if(k==5)
        flag5=1;
    }
   if(flag1&&flag2&&flag5)
        arr[t]+=1;
    m=t;
   arr2[t]=arr2[t-1];
    while(m>0)
    {
      k=m%10;
      m=m/10;
     if(k==1&&t>0)
      {
        x=m;
        k=x%10;
        x=x/10;
       if(k==2&&x>0)
        {
          y=x;
          k=y%10;
          if(k==5)
          {
           arr2[t]+=1;
            break;
          }
        }
      }
    }
  }
 while(scanf("%d%d",&a,&b)!=EOF)
  {
   printf("Case %d:%d%d\n",i++,arr[b]-arr[a-1],arr2[b]-arr2[a-1]);
 //   printf("\n"); 
 //   printf("Case %d:%d%d\n",i++,arr[b],arr2[b]);
  }
 system("pause");
  return 0;    
}