我不完全相信你的模方法會因爲工作,如果你開始與7823
和78
,然後7823 mod 100
給你23
具有沒有公共數字與78
即使7823
呢。
但是,即使我誤解了規範,它確實奏效,我認爲還有更好的辦法。首先,如何得分一個基於它包含的數字的數字。
如果你的整數至少有10位(他們會,因爲標準要求一個範圍需要16位),你可以使用一個位掩碼,每位表示數字是否包含數字。我們可以使用一個正常的int
這一點,因爲十位將使我們無法在附近這個可能會導致我們問題的符號位。
的進球數的代碼是:
// Return a bitmask with the bottom ten bits populated,
// based on whether the input number has a given digit.
// So, 64096 as input will give you the binary value
// 000000 0000111010
// <-unused^^^^
//(digits)
int getMask (int val) {
int mask = 0; // All start at 0
while (val > 0) { // While more digits
mask = mask | (1 << (val % 10)); // Set bit of digit
val = val/10; // Move to next digit
}
return mask;
}
的「刁鑽」位有聲明:
mask = mask | (1 << (val % 10));
它所做的是獲得號碼的最後一位,與val % 10
在將val
除以10時給予剩餘部分。所以123 % 10
給出3
,314159 % 10
給出9
等等。
下一步是將二進制文件1
左移很多位,其中1 << (val % 10)
。將1位左移4位可以給出二進制值10000
,因此這只是一種將1位置於正確位置的方法。
最後,按位或與計算值的屏蔽,有效地設置在面具相當於位,牢記位a | b
給你1
如果一方或雙方a
和b
是1
。
或者您可以查看我的其他答案here以瞭解更多詳情。
所以,我聽到你問,這個位掩碼如何幫助我們找到沒有共同數字的數字。那麼,AND按位運算符&
進來 - 這隻會給你一個1
位,如果兩個輸入位是1
(同樣,請參閱前面提供的鏈接關於按位運算符的更多詳細信息)。
一旦你有你的數位掩碼,你可以使用&
與他們按照下面的例子,那裏有沒有共同的數字:
Number Bitmask
------ ----------------
314159 000000 1000111010
720 000000 0010000101
----------------- AND(&)
000000 0000000000
可以看到的是,除非位位置有1
爲兩個數字,結果位將是0
。如果有任何數字都是常見的話,那將是一些非零值:
Number Bitmask v
------ -----------------
314159 000000 1000111010
320 000000 0000001101
----------------- AND(&)
000000 0000001000
^
The bit representing the common digit 3.
這導致我們的實際檢查代碼,一些相對容易建立的打分函數的頂部:
#include <stdio.h>
int main (int argc, char *argv[]) {
// Default input numbers to both zero, then try
// to get them from arguments.
int check = 0, exclude = 0, excludeMask;
if (argc > 1)
check = atoi(argv[1]);
if (argc > 2)
exclude = atoi(argv[2]);
// Get the mask for the exclusion number, only done once.
excludeMask = getMask (exclude);
// Then we loop, looking for a mask that has no
// common bits.
printf ("%d -> ", check);
//check++;
while ((excludeMask & getMask (check)) != 0)
check++;
printf ("%d\n", check);
return 0;
}
該流程基本上是從參數中得到數字,找出排除號碼的位掩碼(不需要想要的結果中的數字),然後從檢查號碼開始查找,直到找到一個。
我註釋掉初始check++
,因爲我不知道你是否真的想比給出的一個更高數量,還是123
與98
排除應該給你的123
實際起始編號。如果不是,只需取消註釋。
有你有它,如下面的成績單,其中包括除其他事情你的測試數據:
$ ./myprog 378 78
378 -> 390
$ ./myprog 3454 54
3454 -> 3600
$ ./myprog 123 98 # would give 124 if 'count++' uncommented
123 -> 123
$ ./myprog 314159 6413
314159 -> 500000
它確實有一個潛在的致命缺陷,但一個是很容易解決,如果您在開始查找之前檢查排除位掩碼。我會離開,作爲一個練習留給讀者,但想想可能與下面的命令發生什麼:
$ ./myprog 1 154862397
,當然,如果你想要去的其他方式(較低的數字) ,這是遞減check
而不是遞增它的問題。當前標準的不得辦理這麼好
$ ./myprog 1 102
代碼:您可能還需要變得有點聰明你想,如果你去否定,比如一起發生什麼。
'int closest = number1 + 1;'here' number1' in uninitialized。 – 2014-10-28 11:40:00
這沒關係,因爲如果我有378和78它需要從379開始。 – 2014-10-28 11:50:18
請檢查您的代碼。 **在**之前做'+ 1'。 – 2014-10-28 11:53:16