不吉利的數字(不HOMEWORK)不吉利的數字
有被認爲是不吉利的幾號(它僅包含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)'。 – schnaader
正在做作業嗎? –
我很確定它可能在'log(n)^ k'時空中(小常數k,但我懶得計算實際的k)。你只需要計算計數,你不需要枚舉全部。你可以使用數字10^n以下的2^n個不幸的數字。 – CodesInChaos