我有这个家庭作业问题:
编写并测试以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;
}
}
答案 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;
}