Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去。
浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字,顿时觉得好浪漫,因为每个男生都会不经意的成为浪漫的制造者。此后,流年走到哪里都能看到5、2、1三个数字,他怒了,现在他想知道在连续的数中有多少数全部包含了这三个数字。例如12356就算一个,而5111就不算。特别的,如果他看到了521三个数连续出现,会特别的愤怒。例如35210。
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]); } }
原文:http://www.cnblogs.com/xiongqiangcs/p/3650201.html