定义了lucky number.
就是一个数的任意从左到右选三个数字a,b,c。
若a<b<c或者a>b>c或者a,b,c三者中存在相同数字,则不是lucky number。
可以证明大于9999的数中不存在lucky number.
然后就是暴力判断1~9999的每个数是不是lucky number.(写的比较挫。)
数组cnt[]存放,1~N的lucky number的总个数.
#include <iostream>
using namespace std;
int cnt[10100];
int fun(int x)
{
if(x>=10000)
return cnt[9999];
else
return cnt[x];
}
int main()
{
int t,l,r,i,a,b,c,d,num;
scanf("%d",&t);
cnt[0] = 0;
for(i=1;i<=10;i++)
{
cnt[i] = cnt[i-1] + 1;
}
for(i=11;i<=99;i++)
{
a = i/10;
b = i%10;
if(a==b)
cnt[i] = cnt[i-1];
else
cnt[i] = cnt[i-1] + 1;
}
for(i=100;i<=999;i++)
{
num = i;
a = i%10;
i /= 10;
b = i%10;
c = i/10;
i = num;
if(a==b||a==c||b==c||(a<b&&b<c)||(a>b&&b>c))
cnt[i] = cnt[i-1];
else
cnt[i] = cnt[i-1] + 1;
}
for(i=1000;i<=9999;i++)
{
num = i;
a = i%10;
i /= 10;
b = i%10;
i /= 10;
c = i%10;
d = i/10;
i = num;
if(a==b||a==c||a==d||b==c||b==d||c==d)
cnt[i] = cnt[i-1];
else if((a<b&&b<c)||(a<b&&b<d)||(a<c&&c<d)||(b<c&&c<d))
cnt[i] = cnt[i-1];
else if((a>b&&b>c)||(a>b&&b>d)||(a>c&&c>d)||(b>c&&c>d))
cnt[i] = cnt[i-1];
else
cnt[i] = cnt[i-1] + 1;
}
while(t--)
{
scanf("%d %d",&l,&r);
printf("%d\n",fun(r)-fun(l-1));
}
return 0;
}