2012-05-23 202 views
0

我正試圖用C中的矢量(數組)來實現以下問題的解決方案。我想輸入一個數字及其出現的次數。計算C數組中出現的數字(矢量)

下面是一個例子:

Imput n: 5 

Imput num 1: 8 
Imput num 2: 9 
Imput num 3: 8 
Imput num 4: 5 
Imput num 5: 5 

程序現在將顯示此:

Number 8: 2 occurences 
Number 9: 1 occurences 
Number 5: 2 occurences 

但我的表演:

Number 8: 2 occurences 
Number 9: 1 occurences 
Number 8: 2 occurences 
Number 5: 2 occurences 
Number 5: 2 occurences 

我該怎麼辦??? TY

#include <stdio.h> 
#include <stdlib.h> 
#define SIZE 20 

int main() 
{ 
    int vett1[SIZE], vett2[SIZE]; 
    int n, i, j; 
    int flag; 

    printf ("Imput n: "); 
    scanf ("%d", &n); 

    for (i=0; i<n; i++) 
    { 
     printf ("Imput %d di %d: ", i+1, n); 
     scanf ("%d", &vett1[i]); 
    } 

    printf ("\n\nYour vector: : "); 

    for (i=0; i<n; i++) 
    { 
     printf ("%d ", vett1[i]); 
    } 

    for (i=0; i<n; i++) 
    { 
     flag=0; 

     for (j=0; j<n; j++) 
     { 
      if (vett1[j] == vett1[i]) 
      { 
       flag++; 
      } 
     } 

     vett2[i] = flag; 
    } 

    printf ("\n\n"); 

    for (i=0; i<n; i++) 
    { 
     printf ("Number %d: %d occurencese\n", vett1[i], vett2[i]); 
    } 

    return 0; 
} 
+1

執行[哈希表](http://en.wikipedia.org/wiki/Hash_table)。 – pmg

+3

顯示代碼。 :) – dbrank0

+3

如果您詢問您的代碼,那麼查看它會有所幫助。 – huon

回答

2

您需要一種方法來跟蹤(1)數字和(2)出現的次數。這樣想:如果你是用手和鉛筆和紙做的,而不是用電腦做的,你會怎麼做?

您可能需要一張紙,上面有一張小桌子,左列中的數字和右列中的出現次數。然後你會查看數字(在你的情況8,9,8,5,5)和每個數字,你會檢查它是否在你的桌子。如果它已經在表格中,請將計數增加1。如果它不在表格中,則將它放在一個新行中,計數爲1.

現在您只需將此表格實現爲不是紙張表格,而是作爲某種數據結構。

+1

謝謝你的答案。紙和鉛筆是我的朋友,但我不能找到正確的方法,不能一次數過相同的數字......如何檢查數字是否在表格中? – Lc0rE

0

你最後的代碼編寫:

for (i=0; i<n; i++) 
{ 
    printf ("Number %d: %d occurencese\n", vett1[i], vett2[i]); 
} 

您打印n分別輸入的次數,以顯示相應的occurencese,所以我認爲你只需要更改打印出來的功能是確定。

+0

「改變打印輸出功能」是什麼意思? – Lc0rE

+0

您得到了正確的結果,但打印出的格式不正確。 因此,您只需要將打印輸出功能更新(更改)到案件一次。 –

0

您只想查看每個號碼一次。有幾種方法可以實現這一點:

  1. 每當您檢查一個數字時,首先看看它是否是數組中第一次出現這個數字。如果沒有,就忽略它。非常低效,因爲在查看第n個元素時,您需要返回並檢查之前的所有元素。

  2. 和上面一樣,但是將第一次出現的驗證和計數結合起來。你有兩個嵌套循環,ij。如果j循環看到vett1[j] == vett1[i]其中j<i,這意味着這不是第一次出現這個數字。忽略它。這與您當前的解決方案一樣高效。排序 - 使用qsort對數組進行排序。然後再過一遍。現在每個數字的所有出現都會一個接一個地出現,所以只需要一次數組就可以輕鬆地對它們進行計數。這是最有效的方式,但有點複雜。

+0

比Yoy的答案!我是編程新手,我該如何排序vetor?我只知道氣泡排序算法... – Lc0rE

+0

您可能想要解決方案#2以避免排序。你可以實現冒泡排序,或者使用C的標準'qsort'函數來實現快速排序。 – ugoren

0

你的代碼是正確的,你只需要修改你的最後一個印刷for循環只檢查情況,要是有該元素類似於以前那麼跳過重新打印。

for(i=0;i<n;i++) 
{ 
    if(vett1[i+1] == vett1[i]) 
     continue; 
    else 
     printf("Number %d %d occurence",vett1[i],vett2[i]); 
}