标签:led efault 方法 out 子函数 std 部分 span 相同
大家刚过完寒假,肯定还没有进入状态,特意出了一道签到题给各位dalao压压惊。
如果一个数字其中每一位都互不相同,则这个数满足要求。(如:21、10满足要求,11 不满足要求)。
给出一个范围[a,b],并求出在范围内符合要求数字的数量。
第一行T表示组数,T<=1000.
每一组输入一行,包含两个数字a,b。1<=a,b<=100000.
对于每一组,求出[a,b]范围内符合条件数字的数量。
真的开始心态都崩了
然后,去问了下林喵喵dalao 他跟我说用打表的方法,就是先全部遍历一遍100000个数,把每个数字之前对应的有几个符合标准的数字给记录下来,然后最后输出array[a]-array[b]即可。
然后,对于判断一个数的各个位数是否一样,也有一个很好的子函数,是宇飞想出来的。
奉上函数:
int checkNum(int n) { char arr[] = "0123456789";//先搞一个字符串 while (n != 0) { if (arr[n % 10] <= ‘9‘) //假如一个数在个位中 出现了 且是数字范围 { arr[n % 10] = ‘x‘;//我们把它设置为 x 这样它所对应的数就不在数的范围内了 //下再有这个数 就直接到else 里面了 } else { return 0; } n /= 10;//然后一步步 往百位千位走 } //如果到最后都没有 return 0 那就是符合标准 return 1; }
然后是打表的部分:
for(int i=1;i<=100000;i++) { if(checkNum(i)) { cnt++; } array[i]=cnt; }
再最后在主函数中,要考虑一个地方,就是在减的过程中,考虑下小数是否符合条件,符合我们还要+1,不符合,直接减。
最后,完整ac代码:
#include <iostream> #define length 100001 using namespace std; int checkNum(int); int array[length] = {}; int main() { int cnt=0; for(int i=1;i<=100000;i++) { if(checkNum(i)) { cnt++; } array[i]=cnt; } // cout<<array[10]<<endl; int cishu; cin>>cishu; int m,n; int number; while(cishu--) { cin>>m>>n; if(checkNum(m))//要考虑小的那个数符不符合标准 { cout<<array[n]-array[m]+1<<endl;//符合标准 我们还得加上小的数 } else{ cout<<array[n]-array[m]<<endl;//不符合标准我们直接退出 } } return 0; } int checkNum(int n) { char arr[] = "0123456789";//先搞一个字符串 while (n != 0) { if (arr[n % 10] <= ‘9‘) //假如一个数在个位中 出现了 且是数字范围 { arr[n % 10] = ‘x‘;//我们把它设置为 x 这样它所对应的数就不在数的范围内了 //下次就直接到else 里面了 } else { return 0; } n /= 10;//然后一步步 往百位千位走 } //如果到最后都没有 return 0 那就是符合标准 return 1; }
标签:led efault 方法 out 子函数 std 部分 span 相同
原文地址:http://www.cnblogs.com/William-xh/p/7137946.html