我试图显示我的数组qt的排名列表,其中包含5个数字。
int i, j;
int qt[5] = {10,20,10,50,20};
int tempqt;
for (i=0; i<5; i++)
{
for(j=(i+1); j<5; j++)
{
if (qt[i] >= qt[j])
{
tempqt = qt[i];
qt[i] = qt[j];
qt[j] = tempqt;
}
}
}
for(i=0; i<5; i++)
{
cout << i+1 << ".number: " << qt[i] << endl;
}
通常,2个for循环对我的数组进行排序,最后一个for循环显示我的数组有序,所以它看起来像这样:
但是我希望显示与相同排名位置具有相同值的数字,所以像这样:
答案 0 :(得分:2)
当在rank
数组中遇到不同的值时,想法是增加qt
计数器。
i = 0;
int rank = 1, val = qt[i];
cout << rank << ".number: " << qt[i] << endl;
for(i=1; i<5; i++)
{
if (qt[i] != val) {
++rank;
val = qt[i];
}
cout << rank << ".number: " << qt[i] << endl;
}
答案 1 :(得分:2)
使用std::sort
对数组进行排序 - 在数组排序之前,您无法获得任何位置。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int qt[5] = { 10, 20, 10, 50, 20 };
sort(qt, qt + 5);
int count = 1;
for (int i = 0; i < 5; ++i)
{
if (i > 0)
{
if (qt[i] != qt[i - 1])
++count;
}
cout << count << ".number: " << qt[i] << endl;
}
}
这是使用地图的另一种解决方案。这更像是懒惰&#34;因为没有真正的&#34;检查数字是否已经看过&#34;涉及的逻辑。只需在地图中添加数字,然后在循环中打印出结果。
如果没有内存限制(当然你需要创建数字的映射),和/或你需要数组保持稳定(没有排序),那么这可能是另一种选择。
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int qt[5] = { 10, 20, 10, 50, 20 };
std::map<int, int> IntMap;
// add entries to map, adding to a counter each time
for (int i = 0; i < 5; ++i)
IntMap[qt[i]]++;
// output the results.
int count = 1;
for (auto it = IntMap.begin(); it != IntMap.end(); ++it, ++count)
{
for (int i = 0; i < it->second; ++i)
cout << count << ".number: " << it->first << endl;
}
}
地图已经排序,因此需要处理。然后设置地图以计算每个数字显示的次数,以便进行处理。剩下的唯一事情是编写一个循环,只是通过地图并打印信息。
请在此处查看:http://ideone.com/q08SeX
答案 2 :(得分:1)
我宁愿使用do while循环:
int p = 1, x = 0;
do
{
cout << p << ".number: " << qt[x++] << endl;
if (x < 5 && qt[x] != qt[x-1])
p++;
} while (x < 5);