这题吧,其实不是很难,就是在一个数里面找4和62,如果有,就是不幸运数字。
这是我最初的想法,但是会超时。
#include <iostream> #include<math.h> #include <iomanip> #include<cstdio> #include<string> #include<map> #include<vector> #include<list> #include<algorithm> #include<stdlib.h> #include<iterator> #include<sstream> #include<string.h> using namespace std; //超市代码 int find462(int n) { int temp=n; int flag62=0; int flag4=0; int ck; while(temp>0) { ck=temp%10; if(ck==4) { return 1;//不吉利 } else if(ck==2) { if(flag62==0) { flag62=1; } } else if(ck==6) { if(flag62==1) { return 1; } } else { flag62=0; } temp=temp/10; } } int main() { int m,n; while(cin>>m>>n) { int cnt=0; if(m==0&&n==0) { break; } for(int i=m;i<=n;i++) { if(find462(i)==0) { cnt++; } } cout<<cnt<<endl; } return 0; }
然后网上找了一种很投机取巧的办法,就是先在把范围中所有的不幸运数字全部找出来,然后再判断输入的范围中有没有这些数字,这样可能就是调用函数次数少了,然后就快了。
#include <iostream> #include<math.h> #include <iomanip> #include<cstdio> #include<string> #include<map> #include<vector> #include<list> #include<algorithm> #include<stdlib.h> #include<iterator> #include<sstream> #include<string.h> using namespace std; int a[1000001]; int main() { int temp; memset(a,0,sizeof(int)*1000001); for(int i=1;i<1000001;i++) { temp=i; while(temp>0) { if(temp%10==4||temp%100==62)//这个 算法还是很 666的 { a[i]=1; break;//下一个 i } temp=temp/10; } } int m,n; while(cin>>m>>n) { int cnt=0; if(m==0&&n==0) { break; } for(int i=m;i<=n;i++) { if(a[i]==0) { cnt++; } } cout<<cnt<<endl; } return 0; }