2016-03-05 65 views
-1
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() { 
    srand(time(NULL)); 

    // Use these variables in a switch statement to count each digit. 
    int x0 = 0, x1 = 0, x2 = 0, x3 = 0, x4 = 0, x5 = 0, 
     x6 = 0, x7 = 0, x8 = 0, x9 = 0, num; 

    for (int i = 0; i < 5; i++) { 
     num = rand() % 1000; 
     printf("%d\n", num); 

     switch (num % 10) { // Splits third digit and counts. 
      case 0: x0++; break; 
      case 1: x1++; break; 
      case 2: x2++; break; 
      case 3: x3++; break; 
      case 4: x4++; break; 
      case 5: x5++; break; 
      case 6: x6++; break; 
      case 7: x7++; break; 
      case 8: x8++; break; 
      case 9: x9++; break; 
     } 

     switch (num/10 % 10) { // Splits second digit and counts. 
      // add case statements 
     } 

     switch (num/100 % 10) { // Splits first digit and counts. 
      // add case statements 
     } 
    } 
    printf("You have %d 0 digits.\n", x0); // Testing 
    printf("You have %d 1 digits.\n", x1); 
    return 0; 
} 

我想在0-999之間生成200個隨機數字,將它們分成數字,並獲得每個數字的頻率計數而不使用任何數組。我玩弄了一下,想出瞭如何拆分一個數字(以相反的順序)以及如何生成隨機數字。現在我該如何拆分所有200個數字並將這些數字存儲在變量中,我可以使用這些數字?我是否需要三個變量,分別命名爲digit1,digit2,digit3如何分割C中的隨機數並獲得每個數字的頻率計數而不使用數組?

注意:這是作業,所以我不允許使用數組,並且必須使用switch語句來計算每個數字的頻率。

+0

您需要10個變量來存儲計數,例如, count0,count1,... count9。數字可以循環提取,除非你不允許使用循環:/ – user3386109

+0

我被允許使用循環,幸好哈哈。 –

+0

你不應該被允許在一個源文件':-)'中扔太多換行和空間不足' – chqrlie

回答

0

您已經知道如何將數字拆分爲數字。而不是僅打印數字,請使用switch語句中的拆分表達式並添加10個case子句,其中每個子句都會增加一個不同的變量。由於無法使用數組,因此您將需要10個變量。如果可以使用,或者通過複製switch聲明和子句,則可以在循環中再次進行更高位數的操作。如果隨機數小於10100,則可能需要提前停止。

爲10個計數器添加定義並將它們初始化爲0。在生成循環內移動計數代碼,並在最後添加打印循環。如果你提早結束,統計數據應該顯示出對數字0的偏差,否則所有數字都應該顯示非常接近的計數,但是ramdomness會產生變化,而這些並不是異常,只是不太可能。

+0

這是我在解決任何代碼之前必須解決的問題。我只是不確定如何獲取這200個數字中的每一個,並在循環迭代時分別給出switch語句。我需要一些方法來存儲每個數字,這使得使用數組很有意義。但沒有一個?我可以將'rand()%1000'賦值給'for'循環中的一個變量嗎? –

+0

@NickM:你不需要存儲200個隨機數字,只需將當前數字存入一個'num'變量,並用它來提取每個數字並切換數字。在主'for(int i = 0; i <200; i ++)'循環內寫入所有這些步驟。 – chqrlie

+0

我實現了case語句,但在測試時肯定會遇到一些不一致的計數。 –

1

老實說,我認爲形式的問題,「寫這個簡單的程序,而無需使用的功能> <隨機採集」屬於上Programming Puzzles and Code Golf

總之,這裏是我的解決方案,以「計數的數字出現的頻率在一組200三位數字不使用陣列「:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
int main() { 
    static const unsigned long long mask = 040404040404040404040; 
    unsigned long long hibits = 0, lobits = 0; 
    srand(time(0)); 

    for (int i = 0; i < 200; ++i) { 
    unsigned r = rand() % 1000; 
    do 
     lobits += 1ULL << (6 * (r % 10)); 
    while (r /= 10); 
    unsigned long long carries = lobits & mask; 
    hibits += carries >> 5; 
    lobits -= carries; 
    } 

    for (int d = 0; d < 10; ++d, lobits>>=6, hibits>>=6) 
    printf("%d:%4llu\n", d, ((hibits & 077) << 5) + (lobits & 037)); 
    return 0; 
} 

應當觀察到,它能夠處理的最大頻率爲2047,因爲它使用各頻率的總的11位,配置在10兩個向量每個六位大塊。爲了簡單起見,我使用低階塊的高階位來保持進位。再多做一點工作,就可以使用全部12位,但OP只需要計數高達600,所以11位就足夠了。

我會推薦而不是提交此作爲您的家庭作業問題的解決方案。

+0

*多一點工作* ...我愛你的意想不到的雙關語。 – chqrlie

+0

OP特別需要使用'switch'語句,你能想出一個量身定製的Duff設備嗎? – chqrlie

+0

@chqrlie:你可以加上'switch(0){default:/ *以下數字計算一個數字的頻率* /; }'somewhere :) – rici

相關問題