unlucky number
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
0
-
描述
-
我们定义在区间【l,r】之间只出现1和7组合的数是unlucky number,例如:1 、7、 11、17 都是unlucky numbers ,而 13 、27则不是,问在区间【l,r】内有多少 unlucky numbers??
-
输入
-
有多组测试数据(不超过100组)
每组输入两个整数l,r( 0 =< l<= r <= 10^18)
输出
- 每行输入一个结果 样例输入
-
1 7
样例输出
-
2
上传者
思路:我的代码超时了。。应该是先打表,把unlucky number写到数组中,然后再判断l,r之间的数是不是在数组所对应的数之中,计数。参考博客 http://blog.csdn.net/qq_qingtian/article/details/44813603#comments
我的超时代码:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { int j,lena,flag; long long l,r,i,count; char a[22]; while(scanf("%lld%lld",&l,&r)!=EOF) { count=0; if(l>r) { long long t; t=l; l=r; r=t; } for(i=l;i<=r;i++) { flag=0; sprintf(a,"%d",i); lena=strlen(a); for(j=0;j<lena;j++) { if(a[j]!='1' &&a[j]!='7') { flag=1; break; } } if(flag==0) count++; } cout<<count<<endl; } return 0; }
ac 代码:#include<iostream> #include<stdio.h> using namespace std; long long a[1000000]; int c; void dabiao() { c=0; int k=0; a[c++]=1; // a[0]=1 a[c++]=7; // a[1]=7 while(a[c-1]<1e18) { a[c++]=a[k]*10+1;// a[2]=11 a[4]=71 a[6]=111 a[c++]=a[k]*10+7;// a[3]=17 a[5]=77 k++; } } int main() { long long l,r; int count; int i; dabiao(); while(scanf("%lld%lld",&l,&r)!=EOF) { count=0; for(i=0;i<c;i++) { if(a[i]>=l &&a[i]<=r) count++; else if(a[i]>r) break; } printf("%d\n",count); } return 0; }
-
有多组测试数据(不超过100组)