【发布时间】:2011-09-18 09:17:02
【问题描述】:
不吉利的数字(不是家庭作业)
有几个数字被认为是不吉利的(它只包含 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);
}
【问题讨论】:
-
次要优化说明:您的方法
k = 1;[...]+ unlucky[k ^= 1];生成序列4,7,4,7,4...正在使用数组查找,您可以使用类似k = 7;[.. .]+ (k = 11 - k). -
我很确定在
log(n)^ktime&space 中是可能的(常数k很小,但我懒得计算实际的k)。你只需要计算个数,不需要一一列举。您可以使用数字 10^n 下方有 2^n 个不吉利的数字。 -
@Luchian: 准确地说是 log(N) ^_^
-
我相信建议的解决方案是 O(1)
-
@yi_H - 不,这不是作业。我在一个网站上遇到了这个问题并试图解决它。这个论坛上是否有一个协议,我必须明确指出它“不是家庭作业”,如果有,请说出来
标签: algorithm