不幸的号码(不是家庭作业)
有些数字被认为是不吉利的(它只包含4和7)。我们的目标是在正整数a和b的范围内找到这些数字的计数
例如:
输入:a = 10 b = 20
输出:0
输入:a = 30 b = 50
输出:2(44,47)
下面是我使用静态数组方法尝试的代码,其中我最初计算32位整数的所有可能的不幸数字。这在O(n)中完成,并且稍后顺序扫描有助于获得再次为O(n)操作的计数。没有静态数组的帮助,有没有更好的方法来解决这个问题?
#define MAX_UNLUCKY 1022
static int unlucky[MAX_UNLUCKY];
int main(int argc, char **argv) {
int i, j, k;
int a, b, factor;
printf("Enter the numbers : \n");
scanf("%d",&a);
scanf("%d",&b);
unlucky[0] = 4;
unlucky[1] = 7;
factor = 10;
k = 1;
for(i = 2; i < MAX_UNLUCKY; ++i)
unlucky[i] = unlucky[(i >> 1) - 1]*factor + unlucky[k ^= 1];
for (i = 0; i < MAX_UNLUCKY;++i)
if (unlucky[i] > a) break;
for (k = i; k < MAX_UNLUCKY;++k) {
if (unlucky[k] > b) break;
printf("Unlukcy numbers = %d\n", unlucky[k]);
}
printf ("Total Number of Unlucky numbers in this range is %d\n", k-i);
return (0);
}
答案 0 :(得分:3)
请考虑以下事项:
之间有多少个数字
0x100 and 0x111?
100,101,110,111 ( 4 = 0x111 - 0x100 + 1 )
这正是744和777(744,747,774,777)之间有多少不吉利的数字。
现在:
700和800在744和777之间具有相同数量的不幸数字。 744是最大的不幸数字大于700而777是最不幸的数字,小于800.
无需生成数字,只需减法。
对于a = 10,b = 800的情况,首先找到你的数字10-100然后100-800(因为你将计算两次数字):
10-100:
a = 44
b = 77
0x11 - 0x00 = 3 + 1 = 4 ( 44,47,74,77 )
对于100-800:
a = 444
b = 777
0x111 - 0x000 = 7 + 1 = 8 ( 444, 447, 474, 477, 744, 747, 774, 777 )
因此在10到800之间:4 + 8 = 12个数字,这也是正确的。
这也是O(1)时间&amp;空间,如果你有效地找到辅助数字,这不应该太难......