2016-03-05 44 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