【问题标题】:C program histogram print results only onceC程序直方图只打印一次结果
【发布时间】:2022-01-12 11:58:45
【问题描述】:

如果我在数组之间例如 [1,1,1,2] 程序会打印:

数字 1 出现 3 次。

数字 1 出现 3 次。

数字 1 出现 3 次。

数字 2 出现 1 次。

它应该打印出来:

数字 1 出现 3 次。

数字 2 出现 1 次。

如何解决这个问题?

#include <stdio.h>

int main() {
    int i,arr[1000],counters[1001]={0},n;
    printf("Enter numbers: \n");
    for(i=0;i<100;i++){
        scanf("%d", &arr[i]);
        if(arr[i]==-1) break;
        if(arr[i]<0||arr[i]>100){
            printf("Numbers must be between 0 and 100\n");
            i--;
        }
    }
    n=i;

    for(i=0;i<n;i++){
        counters[arr[i]]++;
    }

    for(i=0;i<n;i++){
        printf("Number %d appears: %d times\n", arr[i], counters[arr[i]]);
    }
    

    return 0;
}

【问题讨论】:

    标签: arrays c histogram


    【解决方案1】:

    您正在循环输入的总数,因此在这种特殊情况下您会得到 4 行输出。但是,由于您使用的非负整数数量相对较少,因此您可以通过让索引表示输入来大大简化程序,如下所示:

    #include <stdio.h>
    
    
    int main() {
      int arr[101]={0}, n;
      printf("Enter numbers (end with -1): \n");
      while (1) {
        scanf("%d", &n);
        if(n==-1) break;
        if(n<0 || n>100) {
          printf("Numbers must be between 0 and 100\n");
          continue; 
        }
        arr[n]++; 
      }
      
      for(n=0;n<=100;n++){
        if (arr[n]) printf("Number %d appears: %d times\n", n, arr[n]);
      }
    
      return 0;
    }
    

    【讨论】:

      【解决方案2】:

      不要遍历多次出现相同数字的数组,而是将迭代器增加出现次数以立即跳转到下一个数字:

      for(i=0;i<n;i+= counters[arr[i]]){
          printf("Number %d appears: %d times\n", arr[i], counters[arr[i]]);
      }
      

      【讨论】:

      • 非常感谢
      【解决方案3】:

      遍历计数器数组并打印计数器 > 0

      for (i = 0; i < 100; i++) 
      {
          if (counters[i])
          {
              printf("Number %d appears: %d times\n", i, counters[i]);
          }
      }
      

      【讨论】:

      • 非常感谢
      猜你喜欢
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多