C程序直方图只打印一次结果
C program histogram print results only once
如果我插入数组,例如 [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;
}
不是遍历多次出现相同数字的数组,而是按出现次数递增迭代器以立即跳转到下一个数字:
for(i=0;i<n;i+= counters[arr[i]]){
printf("Number %d appears: %d times\n", arr[i], counters[arr[i]]);
}
遍历计数器数组并打印计数器 > 0
for (i = 0; i < 100; i++)
{
if (counters[i])
{
printf("Number %d appears: %d times\n", i, counters[i]);
}
}
您正在遍历输入的总数,因此在此特定情况下您会得到 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;
}
如果我插入数组,例如 [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;
}
不是遍历多次出现相同数字的数组,而是按出现次数递增迭代器以立即跳转到下一个数字:
for(i=0;i<n;i+= counters[arr[i]]){
printf("Number %d appears: %d times\n", arr[i], counters[arr[i]]);
}
遍历计数器数组并打印计数器 > 0
for (i = 0; i < 100; i++)
{
if (counters[i])
{
printf("Number %d appears: %d times\n", i, counters[i]);
}
}
您正在遍历输入的总数,因此在此特定情况下您会得到 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;
}