ACM 關於521

OpenSoucre發表於2014-04-07

關於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

打表法解決,本題將整數轉換成字串,然後查詢字串判斷是否有5,2,1,521
題目感覺略坑,直接用stringstrean去將整數轉換成字串超時,但用sprintf可以通過
#include<iostream>
#include <string>
#include <sstream>
#include <cstdio>
#include <cstdlib>
using namespace std;

int table[1000000]={0},table521[1000000]={0};

void make_table(){
    for(int i = 125; i < 1000000; ++ i){
        table[i]=table[i-1];
        table521[i] = table521[i-1];
        char c[10];
        sprintf(c,"%d",i);
        /*
        stringstream ss;
        ss << i;
        string num(ss.str());*/
        string num(c);
        if(num.find('5')!= string::npos && num.find('2')!=string::npos && num.find('1')!=string::npos){
            table[i]++;
            if(num.find("521")!=string::npos) table521[i]++;
        }
    }
}

int main(){
    make_table();
    int a,b,cnt = 0;
    while(cin >> a >> b){
        printf("Case %d:%d %d\n",++cnt,table[b]-table[a-1],table521[b] - table521[a-1]);
    }
}