c语言数组元素判断是不是相同以及相同的个数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言数组元素判断是不是相同以及相同的个数相关的知识,希望对你有一定的参考价值。

一个一维数组,输入从小到大排列的6个数字,判断其中元素中最大的相同个数以及相同的项。
比如说
输入:1 3 4 5 7 7,输出:x[5],x[6],相同数=2。
输入:1 5 5 5 8 9,输出:x[2],x[3],x[4],相同数=3。
输入:4 4 6 6 6 6,输出:x[3],x[4],x[5],x[6],相同数=4。

// 下面的算法还可以优化,就留给楼主自己思考:
#include <stdio.h>
#include <stdlib.h>

#define  ARR_MAX 6

static int temp[ARR_MAX];
bool  temp2[ARR_MAX];

void reset()  // 初始化静态区变量 temp与temp2
    for (int i=0;i<ARR_MAX;i++)
         temp[i]=1;
         temp2[i]=true;
    


int repeat_e(int a[ARR_MAX])
    reset();
    // 跳跃式算法,加快检索速度 
    for (int i=0;i<ARR_MAX;i++)
        if(!temp2[i]) continue;
        for (int j=i+1;j<ARR_MAX;j++)

            if (a[i]==a[j])
                temp[i]++;
                temp2[j]=false;
            
         
    

    // 寻找最值算法
    int _max=1; 
    int target_index=-1; // 目标索引
    for(int i=0;i<ARR_MAX;i++) 
        if(temp[i]>_max)
            _max=temp[i];
            target_index=i;
        
    

    return target_index>-1?a[target_index]:-1;


int main(int argc, char* argv[])

    int arr[ARR_MAX]=0;
    scanf("%d %d %d %d %d %d",&arr[0],&arr[1],&arr[2],&arr[3],&arr[4],&arr[5]);
    int target_value=repeat_e(arr);

    if(target_value>-1)
        
        int _count=0;

        for(int i=0;i<ARR_MAX;i++) 
            if(arr[i]==target_value) 
                printf("x[%d],",i+1);
                _count++;
            
        
        printf("\\b ,相同数=%d\\n",_count);

    

    system("pause");
    return 0;

参考技术A 不知道你想过这个问题没有:当相同的数中相同个数的最大值是相等的!
比如说有一组数据:4 4 4 6 6 6
相同数位3 可是相同的却有两组了!
楼下的代码只能解决没有相同的最大值的情况!
我必须的说考虑问题不严谨!
不过要是存在相同的数最大值有多组的情况就会复杂了!
相同的数的最大的个数可能有1个:也就是全都不相同的数如:1 2 3 4 5 6
相同的数的最大个数可能有2个:也就是 2 2 3 3 4 4
相同的数的最大个数可能有3个,也就是:2 2 2 3 3 3 4 4 4
...............这个问题看似简单却是在考验你逻辑思维的严谨性!
参考技术B #include<stdio.h>
int search(int *apt,int n,int key)

int *p;
for(p=apt;p<apt+n;p++) //寻找特定元素
if(*p==key)
return p-apt;
return -1;


int b[]=90,80,70,60,50,40,772,294,1065,184;

int a[]=90,80,70,60,50,40,30,20,10,9,8,7,6,5,42,40,50,1,2,3; //在这里定义的好处是,可以在任意函数中通用

main() //main拼错了

int i;
int c[sizeof(b)/sizeof(b[0])];
int q=0;
int d;
printf("The elements of array a is:\n"); //输出a数组中的元素
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)

printf(" %d",a[i]);

printf("\n");
printf("The elements of array b is:"); //输出b数组中的元素
for(i=0;i<sizeof(b)/sizeof(b[0]);i++)

printf(" %d",b[i]);

printf("\n");
for(i=0;i<sizeof(b)/sizeof(b[0]);i++) //对b中数组的每一个数字都和a中的数字对比一次

int key;
key=b[i]; //关键字是b数组中第i个数字

d=search(a,sizeof(a)/sizeof(a[0]),key); //寻找关键字
if(d>-1)

c[q]=key; //这里要保存数组元素的值key,而不是数组下标d
q=q+1; //这句话应该放在后面,因为数组下标从0开始


printf("The number is:\n",q);
for(i=0;i<q;i++) //这里i的取值应该为i<q
printf(" %d",c[i]);
return 0;追问

我目前还没有学到指针,所以上面的代码有很多都看不懂,能麻烦你不用指针完成吗?谢谢了!

C语言 删除所有相同值的元素

从键盘输入整型一维数组中 a 中的各元素(以元素 0 结束, 0 是最后一个有效果元素,元素个数不超过 20 个),再输入一个待删除的整数。先输出删除前的所有数组元素。从数组中删除所有的元素值等于该整数的元素,如果元素不存在,则输出提示信息: does not exist,no operating! 否则输出删除后的所有数组元素
说明:( 1 )数组的定义: int a[20];
( 2 )应该用一个变量存储实际有效果的元素个数(含 0 )
( 3 )元素的输出用 %5d 的格式控制
( 4 ) scanf 之前不能用 printf 输出提示信息

#include <stdio.h>
#define N 1000
#define FLAG 0x80000000 /*特殊标记,用最小的负数表示*/
void main( )

int r[N], length, i, j;
scanf("%d", &length);
for(i = 0; i < length; i++)
scanf("%d", &r[i]);
for(i = 0; i < length - 1; i++)

if(r[i] != FLAG)

for(j = i + 1; j < length; j++)
if(r[j] == r[i]) r[j] = FLAG; /*遇到重复值,则先用特殊标记覆盖它*/


for(i = 0; r[i] != FLAG; i++); /*找到第一个特殊标记*/
for(j = i + 1; j < length;) /*删除数列中的特殊标记*/

if(r[j] != FLAG) r[i++] = r[j++];
else j++;

length = i; /*修改删除重复值后的数列的长度*/
for(i = 0; i < length; i++)
printf("%-4d", r[i]);
参考技术A #include <stdio.h>
void main()

int a[20] = 0;
int res[20] = 0;
int i, j, flag, total, delnum;
i = j = flag = total = delnum = 0;
scanf("%d", &a[total]);
while(a[total] != 0)

total++;
scanf("%d", &a[total]);

total++;
scanf("%d", &delnum);
printf("Before delete,elements are:\n");
for(i = 0; i < total; i++)

printf("%5d",a[i]);

printf("\n");
flag = 0;
i = j = 0;
while(a[i] != 0)

if(a[i] != delnum)

res[j] = a[i];
j++;

else

flag = 1;

i++;

res[j] = a[i];
j++;
total = j - 1; // 实际有效果数的个数,减去1表示不包含0
if(flag == 0)

printf("does not exist, no operating!\n");

else

printf("After delete,elements are:\n");
for(i = 0; i < j; i++)

printf("%5d",res[i]);

printf("\n");

本回答被提问者采纳
参考技术B /*
2 3 3 4 3 5 3 7 0
Before delete, elements are :
2 3 3 4 3 5 3 7 0
3
After delete,elements are :
2 4 5 7 0
Press any key to continue
*/
#include <stdio.h>
int DeleteElem(
int a[], int *n,int num) int i,j,flag = 0;
for(i = 0; i < *n; ++i)
if(a[i] == num)
for(j = i; j < *n - 1; ++j)
a[j] = a[j + 1];
(*n)--;
--i;
flag = 1;


return flag;


void Show(
int a[], int n) int i;
for(i = 0; i < n; ++i)
printf("%5d",a[i]);
printf("\n");


int main()
int n,num,a[20];
for(n = 0; ; ++n)
scanf("%d",&a[n]);
if(a[n] == 0)
++n;
break;


printf("Before delete, elements are : \n");
Show(a,n);
scanf("%d",&num);
if(DeleteElem(a,&n,num))
printf("After delete,elements are : \n");
Show(a,n);

else printf("does not exist, no operating!\n");
return 0;

以上是关于c语言数组元素判断是不是相同以及相同的个数的主要内容,如果未能解决你的问题,请参考以下文章

c语言中有没有比较简单的算法来判断两个集合有交集

C语言:在十个元素的数组中,判断某数是不是存在。

C语言 判断一个数是不是是数组中的成员 用C语言编程

C语言:判断一个数是不是为回文数,要求如下:

急!!!C语言:输出两组数组中相同的数字

c语言,查找数组中是不是存在某个数?