关于521

关于521

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

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

题解:这道题输入多组数据,如果每一组都重新计算的话必定超时。所以只能先计算整个范围内的值,比如arr[1000000] arr[i]0i共有几个含有同时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;   

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值