我需要编写一个程序,我必须在数组中打印两次或两次以上的数字。为了简单起见,我正在处理一个排序数组。
这是我的代码。
#include <stdio.h>
int main()
{
int n,i;
int a[10]={2,2,2,4,6,6,9,10,10,11};
printf("%d\n",a[10]);
for(i=0;i<10;++i)
{
if(a[i]==a[i+1] && a[i]!=a[i-1])
printf("%d ",a[i]);
else
continue;
}
return 0;
}
代码似乎运行正常,但我不喜欢我的代码,因为在某些时候,循环将a [0]的值与[-1]和[9]的值与[10]进行比较,两者都是这些,[-1]和[10]是垃圾值。我确信有更好的方法可以做到,但我无法想到任何。
另外,我需要扩展上述程序来计算重复数字的频率。
帮助表示赞赏。谢谢!
答案 0 :(得分:2)
首先,您无法访问printf行中的[10],这不在您的数组中。
这应该可以正常工作。
#include <stdio.h>
int main()
{
int n,i;
int a[10]={2,2,2,4,6,6,9,10,10,11};
for(i=0; i < 9; ++i)
{
if(a[i] == a[i+1])
if(i > 0 && a[i] == a[i-1])
continue;
else
printf("%d ",a[i]);
}
return 0;
}
编辑:或者您可以使用更短但更难阅读的内容:
for(i=0; i < 9; ++i)
{
if(a[i] == a[i+1] && (!i || a[i] != a[i-1]))
printf("%d ",a[i]);
}
答案 1 :(得分:1)
请参阅下面的代码以获取解决方案,该解决方案仅打印阵列中的重复数字以及它们出现的次数。
我添加了用于计数的int c。它最初设置为1,每个重复数字增加1。
#include <stdio.h>
using namespace std;
int main() {
int n,i,c;
int a[10]={2,2,2,4,6,6,9,10,10,11};
c = 1;
for(i=0; i < 9; ++i)
{
if (a[i] == a[i+1]) {
n = a[i];
c += 1;
} else {
if (c > 1) {
printf("Number: %d, Occurences: %d \n",n,c);
c = 1;
}
}
}
return 0;
}
答案 2 :(得分:0)
由于数组已经排序,因此在for
循环中使用另一个循环会更容易做到这样的事情。
int duplicateCount = 1; // Must be at least one instance of a value in the array
for(int i = 0; i < 9; ++i) {
int j = i;
while(j != 9 && a[j] == a[j + 1]) {
++j;
++duplicateCount;
}
i = j; // j is now at end of list of duplicates, so put i at the end as well,
// to be incremented to the next unique value at end of for loop iteration
printf("%d: %d\n", a[j], duplicateCount);
duplicateCount = 1; // Reset for next values
}
如果要计算所有数字的频率,可以轻松地将duplicateCount
转换为值数组,以计算每个唯一值的频率。为了获得更好的解决方案,您可以使用其他数据结构,例如地图。
答案 3 :(得分:0)
你真的需要有两个索引遍历你的数组。 这是一个开始:
int i = 0;
int j;
while (i < 10) {
for (j = i+1; j < 10; ++j) if (a[i] != a[j]) break;
if (j !+ i+i) printf("%d\n", a[i]);
i = j;
}
答案 4 :(得分:0)
您可以使用仿函数,重载运算符()并返回集(唯一值)。假设您的数组已排序,只需将前一个数组与下一个数组进行比较,如果它们相等则将其插入到集合中。如果它们没有排序,那么你必须为每个条目遍历整个数组。以下是输出作为解释的两个例子。
#include <set>
using namespace std;
未排序的数组:
struct UnsortedArrayDuplicateEntries {
set<int> operator()(int* array, int size) {
set<int> duplicates;
for (int i = 0; i < size - 1; i++)
for (int j = i + 1;j < size; j++)
if (array[i] == array[j])
duplicates.insert(array[j]);
return duplicates;
}
};
排序数组:
struct SortedArrayDuplicateEntries {
set<int> operator()(int* array, int size) {
set<int> duplicates;
for (int i = 0; i < size - 1; i++)
if (array[i] == array[i+1])
duplicates.insert(array[j]);
return duplicates;
}
};
测试排序:
SortedArrayDuplicateEntries d;
int sorted[10]={2,2,2,4,6,6,9,10,10,11};
set<int> resultSorted = d(sorted,10);
for (int i : resultSorted) cout << i << endl;
输出已排序:
2
6
10
测试未分类:
UnsortedArrayDuplicateEntries d;
int unsorted[10]={2,6,4,2,10,2,9,6,10,11};
set<int> resultUnsorted = d(unsorted,10);
for (int i : resultUnsorted) cout << i << endl;
输出未排序:
2
6
10
我希望它有所帮助!
答案 5 :(得分:0)
#include <stdio.h>
int main(){
int i, a[10]={2,2,2,4,6,6,9,10,10,11};
int size = 10;
for(i=0;i<size;++i){
int tmp = a[i];
int c = 1;
while(++i < size && tmp == a[i])
++c;
if(c > 1)
printf("%d times %d\n", tmp, c);
--i;
}
return 0;
}