2014-10-28 76 views
1

我讀了兩個數字,都是intC:找到最接近的第一個數字而不重複第二個數字中的數字?

,我需要做的是做打印高於數量,但最接近第一個數字,如378,但包含任何的數字從第二個數字,例如,78

輸入:378 78,輸出:390,因爲這是最低的數字以上378不包含任何的78數字。

輸入:3454 54,輸出:3600因爲3600是不包含5454數字的第一個最接近的一次。

我想通過從第二個長度獲取第一個數字的最新模數字來做到這一點。例如:

378 mod 100 == 78,然後比較7878數字,如果有相同的數字移動到379,然後檢查379 mod 100 == 79。當比較7978時,7是相同的數字。

依此類推,直到我們拿到390爲例。這應該適用於所有N號碼。

這是我迄今爲止所做的...而且幾乎沒有。

#include <stdio.h> 

int main() 
{ 
    int number1, number2; 
    int closest = number1 + 1; 
    scanf("%d %d",&number1,&number2); 

    int count_modulus = 1; 

    while(number2) 
    { 
     count_modulus = count_modulus * 10; 
     number2 = number2/10; 
    } 
    int mod = count_modulus; 
    int n2 = number2; 
    while(number1) 
    { 
     int remain = number1 % mod; 
     while(remain) 
     { 
      if((remain % 10 == number2 % 10)) 
      { 

      } 
      else 
      { 

      } 
     } 
    } 
    printf("%d",closest); 
    return 0; 
} 
+2

'int closest = number1 + 1;'here' number1' in uninitialized。 – 2014-10-28 11:40:00

+0

這沒關係,因爲如果我有378和78它需要從379開始。 – 2014-10-28 11:50:18

+0

請檢查您的代碼。 **在**之前做'+ 1'。 – 2014-10-28 11:53:16

回答

0

我不完全相信你的模方法會因爲工作,如果你開始與782378,然後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如果一方或雙方ab1

或者您可以查看我的其他答案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++,因爲我不知道你是否真的想比給出的一個更高數量,還是12398排除應該給你的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 

代碼:您可能還需要變得有點聰明你想,如果你去否定,比如一起發生什麼。

相關問題