不吉利的数字
很少有数字被认为是不吉利的(那些只有4和7的数字)。我们的目标是在正整数a
和b
范围内找到这样的数字。
示例1
输入: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);
}
字符串
有没有更好的方法来解决这个问题,而不需要静态数组的帮助?
1条答案
按热度按时间u4dcyp6a1#
考虑以下情况:
中间有多少个数字
字符串
这就是744和777之间有多少个不吉利的数字(744,747,774,777)。
现在:
700和800之间的不吉利数字数量与744和777相同。744是大于700的最小不吉利数字,777是小于800的最大不吉利数字。
不需要生成数字,只需减法。
对于像a = 10,B = 800这样的情况,首先找到10-100的数字,然后找到100-800的数字(因为你会把一些数字数两次):
对于10-100:
型
对于100-800:
型
所以在10和800之间:4+8 = 12个数字,这也是正确的。
这也是O(1)时间和空间,如果你有效地找到辅助数,这应该不会太难。