数组的家庭作业问题

Arrays homework question

本文关键字:问题 家庭作业 数组      更新时间:2023-10-16

我有这个作业问题:

编写并测试一个程序,读入n个整数(n的最大值为20),每个整数都有

一个介于0到100之间的值。然后程序应该打印出唯一的值

在输入的数字和这些值的计数中显示

样本输入:

Enter a the number of integers = 8
Enter 8 integers: 5 6 7 6  6 17 17 35

示例输出:

Number 5: 1
Number 6: 3  
Number 7: 1 
Number 17: 2 
Number 35: 1

我是这样做的:

#include<iostream>
using namespace std;
int main(){
  int a[20], n;
  cout<< "Please enter the number of integers= ";
  cin>> n;
  cout<<"Please enter"<< n<<" integers: ";
  for (int i=0; i<n; i++)
    cin >> a[i];
  for (int k=0; k< n; k++){
    int sum=0;
    for (int i=0; i< n; i++){
      if (a[i]==a[k])
        sum= sum+1;
    }
    cout<< "Number "<< a[k]<<" : "<< sum<< endl;
  }
}

考虑当你迭代你的列表时,你要检查所有的i和k值。所以本质上,如果你有一个包含1 1 2 2的列表,那么第一个将计算自己,以及a[1]处的1。第二个1将计算第一个1和它自己,给你重复的输出。

一种简化的方法是使用hash_map,或者一些类似的结构(我不熟悉c++),将键映射到值,并且不允许重复。这将允许您将唯一的数字记录为键,并仅通过一次遍历列表来增加它们。使用hashMap的优点是可以使程序线性化(尽管我认为在这个阶段这不是一个真正的问题)。

然而,解决这个问题最简单的方法是使用Bin排序技术。这里的基本思想是,您的数字范围只是0到100,这意味着您可以为0到100创建箱子,并增加每个箱子。同样,这是Java代码,没有任何实际输入。
// Count is the key, it uses indexes from 0 to 100, with null values of
// 0 after initialized. Simply iterate the loop, and use the value of
// a[k] to increment the corresponding count in the count array.
// Finally, print the results
int[] a = new int[20];
int[] count = new int [101];
for (int k = 0; k < a.length; k++){
    count[a[k]]++;
for (int i = 0; i < count.length; i++){
    if (count[i] > 0)
        System.out.println(i + ": " + count[i]);
}

添加另一个bool b[20],初始化为true。然后每次检测到a[k]是一个骗局,就设置b[k] = false。如果b[k] == true

只打印a[k]
for (int k = 0; k < n; k++) {
    if (!b[k]) {
        continue;
    }
    int sum = 0;
    for (int i = 0; i < n; i++) {
        if (a[i] == a[k]) {
            sum = sum + 1;
            b[i] = false;
        }
    }
    cout << "Number " << a[k] << " : " << sum << endl;
}

你必须在一个单独的数组中保存你处理的项目的运行计数,并且在运行你的内部循环来计数项目之前,检查你试图计数的项目是否已经在你的第二个数组中

在打印结果之前,检查是否已经打印了这个数字

这是我的新尝试

一个快速的修复(虽然不是最专业的)是在打印之前创建另一个循环检查重复。

我把你现在的大循环变成了一个更大的怪物。

我也测试过了,它对我有效。= D

for (int k=0; k< n; k++){
    int sum=0;
    for (int i=0; i< n; i++)
    {
        if (a[i]==a[k])    
            sum= sum+1;
    }
    bool repeat = false;
    for(int i = 0; i < k; i++)
    {
        if(a[k] == a[i])
        {
            repeat = true;
        }
    }
    if(!repeat)
        cout<< "Number "<< a[k]<<" : "<< sum<< endl;
}

另一种实现是创建一个包含100个"count"值的数组(当前限制为20个输入值,这将更加消耗内存)。为每个输入值增加相应的项,然后遍历count数组输出非零值。

显然那个描述不够好…也许一些代码会有所帮助(注意:这段代码是未经测试的,但应该足以让您理解这个概念):

#include<iostream>
using namespace std;
int main(){
  int a[101], n, v;
  cout<< "Please enter the number of integers= ";
  cin>> n;
  cout<<"Please enter"<< n<<" integers: ";
  for (int i=0; i<n; i++)
  {
    cin >> v;
    a[v] ++;
  }
  for (int k=0; k< 100; k++){
    if (a[k] > 0)
      {
      cout<< "Number "<< k + 1 <<" : "<< a[k] << endl;
      }
    }
  }
}

在我看来,熟悉标准模板库是编写好程序的关键,因为这是一个家庭作业,你要控制0和100;-))

#include <iostream>
#include <map>
using std::cin;
using std::map;
using std::cout;
using std::endl;
int main() 
{
  int limit = 20;
  int cnt=0; 
  int n; 
  map<int, int> counters;
  while( cnt++ < limit )
  {
    cin >> n;
    ++counters[n];
  }
  for(map<int, int>::iterator it = counters.begin();
          it!=counters.end(); ++ it) 
    cout << it->first << " " << it->second << endl;
  return 0;
}