2017-01-06 89 views
-1

我有一個區間(m,n),那裏我必須打印出所有具有不同數字的數字。我寫了這個,但它只適用於2位數字。我根本不知道如何使它適用於除2位數字之外的任何內容。我想象一下,如果我爲循環添加儘可能多的數字,它將起作用,但間隔(m,n)未指定,因此它必須是可靠的。我一直試圖在6個小時內自己解決這個問題,我絕對厭倦了。X元素數組中的重複項

輸入97,113; 輸出97,98,102,103,104,105,106,107,108,109 數字99,100,101,110+不會被打印,因爲它們有兩個數字,即 相同。

#include<conio.h> 
    #include<math.h> 
    #include<stdio.h> 
    int main() 
    { 
    int m,n,test,checker=0; 
    scanf("%d%d",&m,&n); 
    if(m>n) 
    { 
     int holder=n; 
     n=m; 
     m=holder; 
    } 

    for(int start=m;start<=n;start++) 
    { 
     int itemCount=floor(log10(abs(start)))+1; 

     int nums[itemCount]; 
     int index=0; 
     test=start; 
     do 
     { 
     int nextVal = test % 10; 
     nums[index++]=nextVal; 
     test = test/10; 
     }while(test>0); 
     for (int i = 0; i < itemCount - 1; i++) 
     { // read comment by @nbro 
     for (int j = i + 1; j < itemCount; j++) 
     { 
      if (nums[i] == nums[j]) 
      { 
       checker++;  
      } 
     } 
      if(checker==0)printf("%d ",start); 

     } 
      checker=0; 
    } 
    } 
+0

嗨。發佈代碼時,您可以通過正確的方式提高可讀性。許多編輯有某種自動縮進功能。另外,你能提供一些預期的輸入/輸出的例子嗎? – user1582024

+0

那麼,你想打印給定數字的排列嗎? –

+0

除了'main'中的所有工作之外,還要創建一個函數'bool is_unique_digits(int num)',並且只在該函數內部工作,如果傳遞的數字具有唯一數字則返回'true',否則返回'false'。然後它變成一個簡單的循環在'main' - 'for(int i = startnum; i PaulMcKenzie

回答

0

作爲一種理念的設計:

  • 打印數量爲一個字符串,如果它不是一個字符串了;

  • 申報int d[10];數組並設置爲全零

  • 每個ASCII數字字符串的c

    if (d[c-'0']==1) return 0; // this digit exists already in the number

    else d[c-'0']= 1;

0

只是把if(checker==0)printf("%d ",start);在第二個循環之外的循環

這樣

for (int i = 0; i < itemCount - 1; i++) 
    { 
      for (int j = i + 1; j < itemCount; j++) 
      { 
       if (nums[i] == nums[j]) 
       { 
        checker++; 
        break; 
       } 
      } 
    } 

    if(checker==0) 
     printf("%d ",start); 
     checker=0; 

但是,而不是使用兩個嵌套for循環可以使用計數陣列這是更高效的

-2

檢查1號,可以做

X=10; //number to analyze 
char counts[10]; for int i=0;i<10;i++) counts[i]=0; 
char number[10]; 
sprintf(&number,"%s",X); bool bad=false; 
for(int i=0;i<strlen(number);i++) 
{ 
if(++counts[number[i]-'0']>1) {bad=true;break;} 
}` 
+0

爲什麼'char number [10];'?這個數字可以有任意長度,爲什麼'count'類型是'char',而不是'int'?你用你的解決方案提案混淆很多,你反覆地調用'strlen',這個曾經足夠。 –

1

由於你將它標記爲C++,這裏是一個非常簡單的解決方案,它在循環中使用簡單的模數和除法。沒有轉換爲字符串完成。

#include <iostream> 
#include <bitset> 

bool is_unique_digits(int num) 
{ 
    std::bitset<10> numset = 0; 
    while (num > 0) 
    { 
     // get last digit 
     int val = num % 10; 

     // if bit is on, then this digit is unique 
     if (numset[val]) 
      return false; 

     // turn bit on and remove last digit from number 
     numset.set(val); 
     num /= 10; 
    } 
    return true; 
} 

int main() 
{ 
    for (int i = 97; i <= 113; ++i) 
    { 
     if (is_unique_digits(i)) 
      std::cout << i << "\n"; 
    } 
} 

is_unique_digit功能簡單地取數,並多次採取的最後一位的數字從中提取的數字。然後測試這個數字,看看相同的數字是否出現在比特集中。如果號碼已經存在,立即返回false

如果該數字不在bitset中,則對應於該數字的位將變爲「on」,並將該數字除以10(從數字中有效刪除最後一位數字)。如果循環完成,則返回true

Live Example