数组的家庭作业问题
Arrays homework question
我有这个作业问题:
编写并测试一个程序,读入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;
}
相关文章:
- 动态类的分段错误(家庭作业问题)
- 不知道如何在家庭作业任务中实现一件事
- 我正在尝试为家庭作业加密邮件
- C++ 带有 if 语句的家庭作业编译错误
- 家庭作业问题 - C++更新已识别的变量
- 家庭作业帮助 - 检查表单按钮上的数据
- 家庭作业的排序链表程序中的分段错误
- 在C++测试家庭作业问题中的字符串输入时无法退出循环(作为数据验证)
- 我的家庭作业要求我在函数中使用布尔值.我需要将它们传递给函数吗?
- 这个输出是如何来的.解释(家庭作业帮助)
- 如何优化与范围的匹配(家庭作业)
- 如何使程序将数据正确传递到数组?(家庭作业)
- std::迭代器是否可以检查该迭代器上是否存在下一个元素?(此设计受到家庭作业的限制)
- C++ 家庭作业不循环
- 使用迭代器(家庭作业)的 C++ 矩阵插入值
- 将字符串输入与类数组值进行比较时出现问题C++(Unix 环境)(家庭作业)
- C++ 家庭作业给我带来了问题
- 欧拉全能函数的ACM问题(家庭作业)
- 数组家庭作业问题需要帮助
- 数组的家庭作业问题