2016-08-01 115 views
0

請幫助縮短此功能,以便有25個或更少的行! 它輸出從0到99個號碼的所有可能的組合,縮短或拆分代碼

EX:00 01,00 02,00 03,00 04,00 05,...,00 99,01 02,..., 97 99,98 99

void dp_print_comb2(void) 
{ 
    char a; 
    char b; 
    char c; 
    char d; 

    a = '0'; 
    b = '0'; 
    while (a <= '9') 
    { 
     if (b > '9') 
     { 
      a++; 
      b = '0'; 
     } 
     c = a; 
     if (b == '9') 
      c++; 
     d = b + 1; 
     if (b == '9') 
      d = '0'; 
     while (c <= '9') 
     { 
      ok(a, b, c, d); 
      d++; 
      if (d > '9') 
      { 
       c++; 
       d = '0'; 
      } 
     } 
     b++; 
    } 
} 

所以,如果有分裂此功能,或者縮短請幫助我的方式!謝謝!

如果主要和其他功能需要我可以把他們也!

ps:我開始學習C,並做了一些練習! (抱歉不好英語)

+1

只是表面上,如果你真的只是想減少代碼行(不只是刪除換行符):你有兩種情況下,你檢查'B = ='9',其中'd = b + 1'。 'd = b + 1'不受第一次檢查的影響,所以你可以結合這些'if'語句。另外,'d ++;如果(d>'9')'可以合併爲'if(++ d>'9')'。 'a ='0'; b ='0';'可以寫成'a = b ='0';'。 – lurker

+1

'char a; char b; char c; char d;'可以縮寫爲'char a,b,c,d;'。代碼中的許多其他構造可以通過加入線條以類似的方式縮短。 – pmg

+1

您可以替換'a ='0'; b ='0'; (a = b ='0'; a <='9'; b ++)',並且在'while'循環塊的末尾刪除'b ++',同時(a <='9')''。再次,膚淺的變化....順便說一句,你的代碼不會「打印」任何東西。更簡短的方法是使用從0到99的計數器(整數),並使用'printf(「%02d \ n」,n)'。你的功能將是3或4行。 :) – lurker

回答

0
void dp_print_comb2(void){ 
    for(int ab = 0; ab < 100-1; ++ab) 
     for(int cd = ab + 1; cd < 100; ++cd) 
      printf("%02d %02d, ", ab, cd); 
    puts(""); 
} 
+0

雖然這段代碼可能有助於解決問題,但提供 關於_why_和/或_how_的附加上下文將回答 這個問題會顯着改善其長期值 的值。請[編輯]你的答案,添加一些解釋。 –

+0

TL; DR。沒有特別的問題,表明它可能在一個簡單的循環中。 – BLUEPIXY

+0

這個問題,從數據[n]中選擇兩個元素。第一個元素選擇索引0..n-1,第二個元素不選擇已被第一個元素選中的元素。它可以簡單地由兩個循環表示。因此,對於(second_index = first_index + 1; second_index BLUEPIXY

-1

如果你想使你的代碼甚至短,可以使單個環路(未經測試,但應工作)。

void foo(){ 
    for(int i=0,j=0;j<100;i=(i+1)%100,j+=!i) 
     printf("%02d %02d,",i,j); 
} 

它是如何工作

  • i和j初始化爲0
  • (環路0〜99)每個循環i遞增。當i = 0時,j保持不變(= 0)
  • (循環100)i返回到0(n%n→0)並且j遞增
  • (循環100到199)每個循環i遞增。爲i = 0Ĵ保持不變(= 1)
  • 等等...

PS1:它不會更快,它使用兩個循環的不太清楚,但它顯示了不同方式來做同樣的事情。

PS2:甚至可以只使用一個變量(但它會更加清晰......)。

+0

1)'int i = 0,int j = 0':無法編譯。 2)OP的例子不包括重疊的組合。 (00,00),(99,99)(和可能(04,05)<=>(05,04)) – BLUEPIXY

+0

@BLUEPIXY *'int i = 0,int j = 0':無法編譯* It可以用符合標準的編譯器進行編譯。 –

+0

@AndrewHenle看到[this](http://ideone.com/wqY0DC) – BLUEPIXY

-1

從你的例子,當數是一樣的,不把它們打印

你的問題不清楚的任何其他約束。

這是代碼,我會用:

#include <stdio.h> 

#define MAX_PLUS_ONE (100) 

// prototype 
void dp_print_comb2(void) 

void dp_print_comb2() 
{ 
    for(unsigned ab=0; ab < MAX_PLUS_ONE; ab++) 
    { 
     for(unsigned cd=0; cd < MAX_PLUS_ONE; cd++) 
     { 
      if(ab != cd) 
      { // then numbers are not the same 
       printf("%02u %02u, ", ab, cd); 
      } // end if 
     } // end for 
    } // end for 
} // end function: db_print_comb2 
+0

當downvoting時,總是包含一個關於爲什麼你在低調。其他方面,沒有人學到任何東西 – user3629249