LXD打算换个手机号码,但是他去营业厅选号码的时候却把移动的客服小姐烦得不行,因为他太挑三捡四啦。对于一个手机号的后六位数字(前面五位他就无所谓了),LXD有很严格的要求,具体如下:
(1)一定要有数字x。
(2)不能有数字k。
(3)这个六位数的大小在区间[l,r]内。
(4)最少要有两个相邻的数字相同。
现在你要计算出这后六位数字有多少组是符合LXD要求的。
标签:
LXD打算换个手机号码,但是他去营业厅选号码的时候却把移动的客服小姐烦得不行,因为他太挑三捡四啦。对于一个手机号的后六位数字(前面五位他就无所谓了),LXD有很严格的要求,具体如下:
(1)一定要有数字x。
(2)不能有数字k。
(3)这个六位数的大小在区间[l,r]内。
(4)最少要有两个相邻的数字相同。
现在你要计算出这后六位数字有多少组是符合LXD要求的。
第一行是一个正整数T,表示总共有T组数据。
接下来有T行(T组数据),每行有四个正整数x,k,l,r。0<=l<=r<=999999,0<=x,k<=9。
每行输出一个整数,对应该组测试数据的答案,符合要求的号码数。
2 1 2 100000 100010 1 4 0 20
10 10
1 #include<stdio.h> 2 int is(int x,int m,int flag) 3 { 4 if(flag==1 && x==0 && m<100000) 5 { 6 return 1; 7 } 8 int i,j; 9 i=m%10; 10 j=m/10; 11 if(j!=0 && i!=x) 12 return is(x,j,0); 13 else if( i==x) 14 return 1; 15 else 16 return 0; 17 } 18 int not(int k,int m,int flag) 19 { 20 if(flag==1 && k==0 && m<100000) 21 { 22 return 0; 23 } 24 int i,j; 25 i=m%10; 26 j=m/10; 27 if(j!=0 && i!=k) 28 return not(k,j,0); 29 else if(i==k) 30 return 0; 31 else 32 return 1; 33 34 } 35 36 int dou(int m,int flag) 37 { 38 if(flag==1 && m<10000) 39 { 40 return 1; 41 } 42 int a[6]; 43 for(int i=0;i<6;i++) 44 { 45 a[i]=m%10; 46 m/=10; 47 } 48 for(int j=0;j<5;j++) 49 { 50 if(a[j]==a[j+1]) 51 { 52 return 1; 53 } 54 } 55 return 0; 56 57 58 } 59 int main() 60 { 61 int x,k,l,r; 62 int n,count; 63 while(scanf("%d",&n)!=EOF) 64 { 65 while(n--) 66 { 67 count=0; 68 scanf("%d%d%d%d",&x,&k,&l,&r); 69 if(l>=0 && r>=l && r<=999999 && x>=0 && k>=0 && x<=9 && k<=9) 70 { 71 for(int i=l;i<=r;i++) 72 { 73 if(is(x,i,1) && not(k,i,1) && dou(i,1)) 74 count++; 75 } 76 printf("%d\n",count); 77 } 78 } 79 } 80 81 82 return 1; 83 }
标签:
原文地址:http://www.cnblogs.com/liuwt365/p/4174650.html