数组作业问题

时间:2011-05-05 16:52:43

标签: c++

我有这个家庭作业问题:

编写并测试以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;
  }
}

7 个答案:

答案 0 :(得分:2)

请注意,当您遍历列表时,您将使用i和k检查所有值。所以基本上,如果你有一个1 1 2 2的列表,那么第一个将自我计数,而1在[1]。第二个1将计算第一个1和它自己,给你重复输出。

简化这种方法的一种方法是使用hash_map或一些类似的结构(我不熟悉C ++)将键映射到值并且不允许重复。这将允许您将唯一数字记录为键,并通过列表中的一次传递递增它们。使用hashMap的好处是可以让你的程序变得线性(虽然我不认为这个阶段真的是一个问题)。

解决问题的最简单方法是使用Bin排序技术。这里的基本思想是你的数字范围只是0到100,这意味着你可以创建0到100的bin并递增每个bin。同样,这是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]);
}

答案 1 :(得分:1)

添加另一个bool b[20],用true初始化它。然后,每当您检测到a[k]是欺骗时,您都会设置b[k] = false。仅在a[k]

时打印b[k] == true
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;
}

答案 2 :(得分:0)

您必须在单独的数组中保持您处理的项目的运行计数,并且在运行内部循环以计算项目之前,检查您尝试计算的项目是否已经不在您的第二个数组中。

答案 3 :(得分:0)

在打印结果之前,请检查您是否已为此号码打印

答案 4 :(得分:0)

另一种实现方式(以及当前限制为20个输入值的内存更多)将创建一个包含100个“计数”值的数组。为每个输入值递增适当的项,然后遍历计数数组输出非零值。

显然描述不够好......或许有些代码会有所帮助(注意:此代码未经测试,但应该足以让您理解这个概念):

#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;
      }
    }
  }
}

答案 5 :(得分:0)

这是我的新尝试。

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

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

我也测试了它,它对我有用。 = 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;

}

答案 6 :(得分:0)

熟悉标准模板库是我拙见编写优秀程序的关键,因为这是一个功课,你可以控制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;
}