Lucky number[SRM403DIVI250]
1.最简单的办法就是用递归来实现。以生成由4,7,9三个数组成,且不超过MAX_NUMBER、不小于MIN_NUMBER的数的个数:
int number(long x) {
if(x > MAX_NUMBER)
return 0;
if(x > MIN_NUMBER)
cout << x << endl;
return number(x*10 + 4) + number(x*10 + 7) + number(x*10 + 9) + (x >= MIN_NUMBER ? 1 : 0);
}
number()返回值是符合条件的数的个数。
用此种方法比较通用,解SRM_403_DIV1_250最为简单。
2.因题中仅要求2个数,因此可以用2进制位构造出所有由这两个数组成的数。
3. 划分成多个区间
如果a和b长度相同,则仅需要双重循环i和j即可。
如果不相同,则只需要计算区间(a, maxnumber of length(a)) + (minnumber of length(b), b) + 长度处于[length(a)+1,length(b)-1]之间的数的个数。后一部分的算法为count = 1 << length; length属于[length(a)+1,length(b)-1]
附原题(From TopCoder)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
用此种方法比较通用,解SRM_403_DIV1_250最为简单。
2.因题中仅要求2个数,因此可以用2进制位构造出所有由这两个数组成的数。
1
for( int k = 1; k <=9; k++ ) {
2
for( int i = 0; i < 1 << k; i++ ) {
3
vec.clear();
4
// generate the lucky number
5
for(int j = 1, index = 0; index < len; j <<= 1, index++) {
6
if( (j & i) == 0 )
7
vec.push_back('4');
8
else
9
vec.push_back('7');
10
}
11
vec.push_back('\0');
12
int num = atoi(&vec[0]);
13
if( a <= num && num <= b )
14
count++;
15
}
16
}
其中,k是用来控制每次生成的数的长度的,最多不超过9。![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
3. 划分成多个区间
如果a和b长度相同,则仅需要双重循环i和j即可。
如果不相同,则只需要计算区间(a, maxnumber of length(a)) + (minnumber of length(b), b) + 长度处于[length(a)+1,length(b)-1]之间的数的个数。后一部分的算法为count = 1 << length; length属于[length(a)+1,length(b)-1]
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)