标签:
Acm队的流年对数学的研究不是很透彻,但是固执的他还是想一头扎进去。
浏览网页的流年忽然看到了网上有人用玫瑰花瓣拼成了521三个数字,顿时觉得好浪漫,因为每个男生都会不经意的成为浪漫的制造者。此后,流年走到哪里都能看到5、2、1三个数字,他怒了,现在他想知道在连续的数中有多少数全部包含了这三个数字。例如12356就算一个,而5111就不算。特别的,如果他看到了521三个数连续出现,会特别的愤怒。例如35210。
分析:直接求解是超时超时的代码:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { char a[100]; int n,m; int k=1; while(cin>>n>>m) { int t1=0; int t2=0; int b1,b2,b3; for(int i=n;i<=m;i++) { b1=0;b2=0;b3=0; sprintf(a,"%d",i); //将整数i转化为字符串 int len=strlen(a); for(int i=0;i<len;i++) { if(a[i]=='5'&&a[i+1]=='2'&&a[i+2]=='1') { t2++; break; } if(a[i]=='5') b1=1; if(a[i]=='2') b2=1; if(a[i]=='1') b3=1; if(b1&&b2&&b3) { t1++; break; } } } printf("Case %d:",k++); printf("%d %d\n",t1+t2,t2); } return 0; }正确的代码:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; struct dot { int t1; int t2; }; dot a[1000050]; int main() { int n,m; int k=1; int t1=0,t2=0; memset(a,0,sizeof(a)); for(int i=100;i<1000000;i++) { if((i%10==1||i/10%10==1||i/100%10==1||i/1000%10==1||i/1000%10==1||i/10000%10==1||i/100000==1) &&(i%10==2||i/10%10==2||i/100%10==2||i/1000%10==2||i/1000%10==2||i/10000%10==2||i/100000==2) &&(i%10==5||i/10%10==5||i/100%10==5||i/1000%10==5||i/1000%10==5||i/10000%10==5||i/100000==5)) t1++; if(i%1000==521||i/10%1000==521||i/100%1000==521||i/1000==521) t2++; a[i].t1=t1; a[i].t2=t2; } while(cin>>n>>m) { printf("Case %d:%d %d\n",k++,(a[m].t1-a[n-1].t1),(a[m].t2-a[n-1].t2)); } return 0; }
标签:
原文地址:http://blog.csdn.net/qq_qingtian/article/details/44086121