2016-10-02 77 views
1

OK所以這個代碼的目的是提示用戶一個整數,然後 該程序將打印出每個數字0-9和它在用戶提供的號碼的出現次數。 輸出應該是這個樣子卡在這個C代碼

Enter a number: 28666 

0 is repeated 0 times. 
1 is repeated 0 times. 
2 is repeated 1 times. 
3 is repeated 0 times. 
4 is repeated 0 times. 
5 is repeated 0 times. 
6 is repeated 3 times. 
7 is repeated 0 times. 
8 is repeated 1 times. 
9 is repeated 0 times. 

這裏是我的代碼和輸出至今。

#include <stdbool.h> 
#include <stdio.h> 

int main(void) 
{ 
    bool digit_seen[10] = {false}; 
    int digit; 
    long n; 


    printf("Enter a number: "); 
    scanf("%ld", &n); 
    while (n > 0) { 
     digit = n % 10; 
     if (digit_seen[digit]) 
     break; 
     digit_seen[digit] = true; 
     n /= 10; 
    } 

    if (n > 0) 
     for(int i=0; i<digit; i++) 
     digit_seen[i]++; 
     for(int i=0; i<digit; i++) 
     printf(" %d is occur %d times \n",i,digit_seen[i]); 
    if (n < 0) 
     printf("No repeated digit\n"); 
    return 0; 
} 

這裏是我的輸出

Enter a number: 147795655                                  
0 is occur 1 times                                    
1 is occur 1 times                                    
2 is occur 1 times                                    
3 is occur 1 times                                    
4 is occur 1 times 

,你可以看到我沒有收到輸出,我需要和我不明白why.If有人可以幫助我理解我要去哪裏錯誤,這將是一個很大的幫助,謝謝。

+0

'bool digit_seen [10] = {false};' - >'int digit_seen [10] = {0};'。記住:你正在計算出現次數,就像在'digit_seen [i] ++;'中一樣。 –

+0

負數不允許重複數字嗎?爲什麼最後一個'if(...)'用於? –

回答

0

您需要兩個循環 - 一個用於計數,另一個用於打印計數。

由於您的預期產出清單所有數字,您不需要單獨的digit_seen循環。您可以簡單地使用n%10n/10分解數字,並按照您的方式進行分解,然後按照步驟遞增digit_count[digit]。你需要添加一個特殊情況爲零,因爲它是你的循環的退出條件。

3

您正在使用bool值來存儲哪些數字存在或哪些不存在,但是如果要計數,每個數字出現多少次,則需要使用int而不是bool

所以,定義digit_seen爲:

int digit_seen[10] = {0}; 

而改變回路,其中你計算沒有數字來此:

while (n > 0) { 
    digit = n % 10; 
    digit_seen[digit]++; 
    n /= 10; 
} 

在這之後,你可以簡單地打印所述digit_seen陣列是這樣的:

for (int i = 0; i < 10; i++){ 
    printf(" %d is occur %d times \n",i,digit_seen[i]); 
} 

編輯

查看suggested code in action here

0

在兩個

for(int i=0; i<digit; i++) 

位是剛剛過去的值在while循環了,所以,數量的第一位。同樣,正退出的同時值將始終爲0,在

if (n > 0) 
    for(int i=0; i<digit; i++) 
    digit_seen[i]++; 

既不

if (n < 0) 
    printf("No repeated digit\n"); 

所以纔在

for(int i=0; i<digit; i++) 
    printf(" %d is occur %d times \n",i,digit_seen[i]); 

進入所以不要進入,然後顯示,如果位是如您的結果所示,以原始n號碼出現或不出現。 你應該檢查你的算法。

0

你的主要錯誤是你試圖增加一個布爾數組「布爾digit_seen [10]」的元素。 你爲什麼不試試這個:

  • 聲明一個用零初始化的整型數組[10]。數組中的每個索引都將表示一個數字,其值將表示其頻率。
  • 在while循環的每次迭代中,digit = n%10然後n = n/10
  • 每次執行此操作時,請將數組中的相應值增加1(例如array [digit] ++)。
  • 然後,您只需打印相應數字(又名數組索引)的頻率。