向高手请教问题!

时间:2020-12-25 09:18:53
请问,如何用C程序实现从3个数组中查找到相同的数据并输出,数组容量为10,工作急用,谢谢!

37 个解决方案

#1


没懂。。。

#2


先从两个数组里面找相同的
结果再和第三个数组比较

#3


引用 2 楼 ayw215 的回复:
先从两个数组里面找相同的
结果再和第三个数组比较


up

#4


帮顶。。关注。。

#5


楼主算法不过关吧?

#6


容量这么小,那就一个一个比较呗。

#7


你这个数据是什么? 是汉字? 英文? 还是数字?

#8


忘记说了,数据是0到19 的数字,再有请各位指点一下,算法不过关,该怎样学?谢谢

#9


for+if

#10



#include <stdio.h>

#define set(i) flag |=  (1<<i)
#define yes(i) flag &   (1<<i)

int     flag;

int main()
{
        int     a[] = {19, 4, 13, 14, 1, 17, 1, 8, 7, 2};
        int     b[] = {9, 18, 9, 15, 16,  7, 5, 16, 3, 2};
        int     c[] = {18, 4, 5, 10, 3, 7, 6, 8, 6, 9};

        int     i;
        for (i=0; i<10; i++) {
                if (yes(a[i])) {
                        printf("%d ", a[i]);
                } else {
                        set(a[i]);
                }
        }
        for (i=0; i<10; i++) {
                if (yes(b[i])) {
                        printf("%d ", b[i]);
                } else {
                        set(b[i]);
                }
        }
        for (i=0; i<10; i++) {
                if (yes(c[i])) {
                        printf("%d ", c[i]);
                } else {
                        set(c[i]);
                }
        }
        return 0;
}

#11


先比较两个数组,找到相同的和第三个数组比较
for循环加if语句

#12


先比较两个数组,找到相同的和第三个数组比较
for循环加if语句

#13


2楼的说的很对啊,先把前面两个数组里相同的数提出来,再把这些数与第三组比较,有相同的就输出.
下面的两个程序是我编译运行了的。都正确,如果程序1DOS屏幕闪的太快而你来不及看结果,就输入我的程序2,你到时只要按个数字,再按回车就可以跳出DOS环境了。
程序1:
#include"stdio.h"
int main()
{
  int a[10]={1,2,5,8,4,6,5,7,3,5};
  int b[10]={0,2,8,15,14,9,7,13,16,6};
  int c[10]={4,8,6,17,18,6,3,8,5,0};
  int i,j,k,m;
  for(i=0;i<10;i++)
    {
      for(j=0;j<10;j++)
       {
        if( a[i]==b[j]) 
        {
          m=a[i];
          for(k=0;k<10;k++)
          {
            if(m==c[k])
            {
              printf("%d",c[k]);
              break;
             }
           } 
         }
       }  
      
    }

}

程序2:
#include"stdio.h"
int main()
{
  int a[10]={1,2,5,8,4,6,5,7,3,5};
  int b[10]={0,2,8,15,14,9,7,13,16,6};
  int c[10]={4,8,6,17,18,6,3,8,5,0};
  int i,j,k,m,n;

  for(i=0;i<10;i++)
    {
      for(j=0;j<10;j++)
       {
        if( a[i]==b[j]) 
        {
          m=a[i];
          for(k=0;k<10;k++)
          {
            if(m==c[k])
            {
              printf("%d,",c[k]);
              break;
             }
           } 
         }
       }  
      
    }
   scanf("%d",&n);
}

#14


引用 2 楼 ayw215 的回复:
先从两个数组里面找相同的
结果再和第三个数组比较
就是这样啊  用个双重循环 就够了

#15


先对三个数组分别进行排序,如  数组 1 2 3 排完序后先选出数组1 2的相同的数,再在数组3中找已在数组1 2中找到的相同的数  若数组三中也有则保存  没有就丢弃

#16


for+if的算法需要遍历1000次,是否有更效率点的算法?越多越好哈,SQ

#17


这3个数组内部会有重复的数字吗?比如说,如果3个数组都有3个1,那么结果输出1个1还是3个1?

10楼的办法可以借鉴,反正是0~19就不会超过32位,每个数字用一个位来表示。但是我看10楼的代码,如果一个数组内部有相同的数,就会输出打印了,是这样吗?
我建议用三个数来分别保存每个数组算出来的值,最后算出来的三个数按位与,然后看结果还有哪几位是1,再输出结果就好了。

#18


int d[20]={0};
for(int i=0;i<10;i++)
  d[a[i]]++;
for(int i=0;i<10;i++)
  d[b[i]]++;
for(int i=0;i<10;i++)
  d[c[i]]++;

for(int i=0;i<20;i++)
 if(d[i]==3)
  cout<<i<<endl;


#19


没太懂,你就用字符匹配函数呗!

#20


#include <stdio.h>

int main()
{
int x,y,z,ts,n=0,tsvalues[10];
int val1[10]={1,22,48,35,65,5,4,8,31,10};
int val2[10]={3,78,5,31,56,42,12,46,68,23};
int val3[10]={96,13,564,31,48,5,9,49,62,26};
for(x=0;x<10;x++)
{
     for(y=0;y<10;y++)
{
     for(z=0;z<10;z++)
        {
         if(val1[x]==val2[y]&&val1[x]==val3[z])
            {
             tsvalues[n]=val1[x];
             n=n+1;
            }
        }
}
    }
if(n)
{
     printf("这三个数组内共有%d个相同的数据,分别是:\n",n);
     for(ts=0;ts<n;ts++)
{
     printf("  %d",tsvalues[ts]);
    }
    }
else printf("这三个数组内没有相同的数据。") ;

return 0;
}

我也是新手,除了用for和if语句循环配合,也没想出什么更加有效率的办法来

#21


突然想到一种可能,如果数据都是按照一定的顺序排列好的或者在程序中用起泡法排列好,例如由小到大排列;
int a[10],b[10],c[10],tsvalues[10];
int x,y,z,n=0;

那么可以比较下每个数组第一个元素的大小,如果:
if(a[0]<b[0]<c[0])

那么这三个数组没有相同的数据;
否则的话,就是有可能有相同的数据:
for(x=0;x<10;x++)
   {
    for(y=0;a[x]<b[y],y<10;y++)
       {
        for(z=0;a[x]<c[z],z<10;z++)
            if(a[x]==b[y]&&a[x]==c[z])
              {
               tsvalues[n]=a[x];
               n=n+1;
              }
       }
   }

上边的代码里,for循环语句中的条件都包含“a[x]<b[y]”或者“a[x]<c[z]”,为的是当第一个数组的数据小于第二个数组的数据时,就不对比后面的数据了,这样就可以减少一定的比较次数,提高程序的效率。
不知道这种方法对LZ有没有用,代码都是随手写出来的,还没有编译过,所以LZ要自己重新写咯。

#22


那么可以比较下每个数组第一个元素的大小,如果:
if(a[0]<b[0]<c[0])

那么这三个数组没有相同的数据;


上边的代码要修改下,如下
if(a[10]<b[0]&&b[10]<c[0])

意思是最大的数值都小过对方最小的数值,那肯定没有相等的可能性。

#23


比较吧,不需要学过算法就能搞定,这么简单。

#24


我有个想法,不知道对不对,
先对三个数组按小到大排序,然后一个for循环,每个位置上依次比较
这样不知道可不可行

#25


数据量小,范围也小,使用标记的方法就可以

#26


该回复于2010-08-04 17:46:41被版主删除

#27


该回复于2010-08-04 17:46:42被版主删除

#28


该回复于2010-08-04 17:46:42被版主删除

#29


#include <stdio.h>

int main()
{
  int a[10]={1,2,5,8,4,6,5,7,3,5};
  int b[10]={0,2,8,15,14,9,7,13,16,6};
  int c[10]={4,8,6,17,18,6,3,8,5,0};

    int tmp[20]={0};

    int i;
    for( i=0; i<10; i++) tmp[a[i]] |=  0x1;
    for( i=0; i<10; i++) tmp[b[i]] |=  0x10;
    for( i=0; i<10; i++) tmp[c[i]] |=  0x100;

    for( i=0; i<30; i++)
    {
        if( tmp[i] == 0x111 ) printf("%d,", i);
    }
}

#30


#include <stdio.h>

int main()
{
    int a[10]={1,2,5,8,4,6,5,7,3,5};
    int b[10]={0,2,8,15,14,9,7,13,16,6};
    int c[10]={4,8,6,17,18,6,3,8,5,0};

    int tmp[20]={0};

    int i;
    for( i=0; i<10; i++)
    {
        tmp[a[i]] |=  0x1;
        tmp[b[i]] |=  0x10;
        tmp[c[i]] |=  0x100;
    }

    for( i=0; i<30; i++)
    {
        if( tmp[i] == 0x111 ) printf("%d,", i);
    }
}

#31


#include <iostream>
using namespace std;

/*从三个数组中找出相同的数据,找到并输出*/
int main()
{
// int a[10],b[10],c[10];
int temp;
int a[10]={1,2,4,6,8,10,12,14,16,18};
int b[10]={3,5,7,20,1,2,8,13,19,16};
int c[10]={1,2,6,7,5,10,15,14,18,16};
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
if(a[i]!=b[j])
continue;
else
  {
  temp=a[i];
        for(int k=0;k<10;k++)
if(temp==c[k])
cout<<"相同的数据是:"<<temp<<endl; 
  }
}


return 0;
}

#32


确定范围是0-19啊
那就for(0-19)
判断每个数字是否在各个数组中也行啊 ,之前最好给数组排个序啥的

#33


10000次以内就别追求什么效率了。

#34



int main()
{
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int c[10] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 5};
int d[20] = {0};
for (int i = 0; i < 10; ++i)
{
++d[a[i]];
++d[b[i]];
++d[c[i]];
}
for (int j = 0; j < 20; ++j)
if (d[j] == 3)
{
printf("%d\n", j);
break;
}
return 0;
}

#35


太棒了 !,谢谢各位了 !

#36


要先感谢郭嘉啊~~

#37


哦 ,都谢,都谢,哈哈

#1


没懂。。。

#2


先从两个数组里面找相同的
结果再和第三个数组比较

#3


引用 2 楼 ayw215 的回复:
先从两个数组里面找相同的
结果再和第三个数组比较


up

#4


帮顶。。关注。。

#5


楼主算法不过关吧?

#6


容量这么小,那就一个一个比较呗。

#7


你这个数据是什么? 是汉字? 英文? 还是数字?

#8


忘记说了,数据是0到19 的数字,再有请各位指点一下,算法不过关,该怎样学?谢谢

#9


for+if

#10



#include <stdio.h>

#define set(i) flag |=  (1<<i)
#define yes(i) flag &   (1<<i)

int     flag;

int main()
{
        int     a[] = {19, 4, 13, 14, 1, 17, 1, 8, 7, 2};
        int     b[] = {9, 18, 9, 15, 16,  7, 5, 16, 3, 2};
        int     c[] = {18, 4, 5, 10, 3, 7, 6, 8, 6, 9};

        int     i;
        for (i=0; i<10; i++) {
                if (yes(a[i])) {
                        printf("%d ", a[i]);
                } else {
                        set(a[i]);
                }
        }
        for (i=0; i<10; i++) {
                if (yes(b[i])) {
                        printf("%d ", b[i]);
                } else {
                        set(b[i]);
                }
        }
        for (i=0; i<10; i++) {
                if (yes(c[i])) {
                        printf("%d ", c[i]);
                } else {
                        set(c[i]);
                }
        }
        return 0;
}

#11


先比较两个数组,找到相同的和第三个数组比较
for循环加if语句

#12


先比较两个数组,找到相同的和第三个数组比较
for循环加if语句

#13


2楼的说的很对啊,先把前面两个数组里相同的数提出来,再把这些数与第三组比较,有相同的就输出.
下面的两个程序是我编译运行了的。都正确,如果程序1DOS屏幕闪的太快而你来不及看结果,就输入我的程序2,你到时只要按个数字,再按回车就可以跳出DOS环境了。
程序1:
#include"stdio.h"
int main()
{
  int a[10]={1,2,5,8,4,6,5,7,3,5};
  int b[10]={0,2,8,15,14,9,7,13,16,6};
  int c[10]={4,8,6,17,18,6,3,8,5,0};
  int i,j,k,m;
  for(i=0;i<10;i++)
    {
      for(j=0;j<10;j++)
       {
        if( a[i]==b[j]) 
        {
          m=a[i];
          for(k=0;k<10;k++)
          {
            if(m==c[k])
            {
              printf("%d",c[k]);
              break;
             }
           } 
         }
       }  
      
    }

}

程序2:
#include"stdio.h"
int main()
{
  int a[10]={1,2,5,8,4,6,5,7,3,5};
  int b[10]={0,2,8,15,14,9,7,13,16,6};
  int c[10]={4,8,6,17,18,6,3,8,5,0};
  int i,j,k,m,n;

  for(i=0;i<10;i++)
    {
      for(j=0;j<10;j++)
       {
        if( a[i]==b[j]) 
        {
          m=a[i];
          for(k=0;k<10;k++)
          {
            if(m==c[k])
            {
              printf("%d,",c[k]);
              break;
             }
           } 
         }
       }  
      
    }
   scanf("%d",&n);
}

#14


引用 2 楼 ayw215 的回复:
先从两个数组里面找相同的
结果再和第三个数组比较
就是这样啊  用个双重循环 就够了

#15


先对三个数组分别进行排序,如  数组 1 2 3 排完序后先选出数组1 2的相同的数,再在数组3中找已在数组1 2中找到的相同的数  若数组三中也有则保存  没有就丢弃

#16


for+if的算法需要遍历1000次,是否有更效率点的算法?越多越好哈,SQ

#17


这3个数组内部会有重复的数字吗?比如说,如果3个数组都有3个1,那么结果输出1个1还是3个1?

10楼的办法可以借鉴,反正是0~19就不会超过32位,每个数字用一个位来表示。但是我看10楼的代码,如果一个数组内部有相同的数,就会输出打印了,是这样吗?
我建议用三个数来分别保存每个数组算出来的值,最后算出来的三个数按位与,然后看结果还有哪几位是1,再输出结果就好了。

#18


int d[20]={0};
for(int i=0;i<10;i++)
  d[a[i]]++;
for(int i=0;i<10;i++)
  d[b[i]]++;
for(int i=0;i<10;i++)
  d[c[i]]++;

for(int i=0;i<20;i++)
 if(d[i]==3)
  cout<<i<<endl;


#19


没太懂,你就用字符匹配函数呗!

#20


#include <stdio.h>

int main()
{
int x,y,z,ts,n=0,tsvalues[10];
int val1[10]={1,22,48,35,65,5,4,8,31,10};
int val2[10]={3,78,5,31,56,42,12,46,68,23};
int val3[10]={96,13,564,31,48,5,9,49,62,26};
for(x=0;x<10;x++)
{
     for(y=0;y<10;y++)
{
     for(z=0;z<10;z++)
        {
         if(val1[x]==val2[y]&&val1[x]==val3[z])
            {
             tsvalues[n]=val1[x];
             n=n+1;
            }
        }
}
    }
if(n)
{
     printf("这三个数组内共有%d个相同的数据,分别是:\n",n);
     for(ts=0;ts<n;ts++)
{
     printf("  %d",tsvalues[ts]);
    }
    }
else printf("这三个数组内没有相同的数据。") ;

return 0;
}

我也是新手,除了用for和if语句循环配合,也没想出什么更加有效率的办法来

#21


突然想到一种可能,如果数据都是按照一定的顺序排列好的或者在程序中用起泡法排列好,例如由小到大排列;
int a[10],b[10],c[10],tsvalues[10];
int x,y,z,n=0;

那么可以比较下每个数组第一个元素的大小,如果:
if(a[0]<b[0]<c[0])

那么这三个数组没有相同的数据;
否则的话,就是有可能有相同的数据:
for(x=0;x<10;x++)
   {
    for(y=0;a[x]<b[y],y<10;y++)
       {
        for(z=0;a[x]<c[z],z<10;z++)
            if(a[x]==b[y]&&a[x]==c[z])
              {
               tsvalues[n]=a[x];
               n=n+1;
              }
       }
   }

上边的代码里,for循环语句中的条件都包含“a[x]<b[y]”或者“a[x]<c[z]”,为的是当第一个数组的数据小于第二个数组的数据时,就不对比后面的数据了,这样就可以减少一定的比较次数,提高程序的效率。
不知道这种方法对LZ有没有用,代码都是随手写出来的,还没有编译过,所以LZ要自己重新写咯。

#22


那么可以比较下每个数组第一个元素的大小,如果:
if(a[0]<b[0]<c[0])

那么这三个数组没有相同的数据;


上边的代码要修改下,如下
if(a[10]<b[0]&&b[10]<c[0])

意思是最大的数值都小过对方最小的数值,那肯定没有相等的可能性。

#23


比较吧,不需要学过算法就能搞定,这么简单。

#24


我有个想法,不知道对不对,
先对三个数组按小到大排序,然后一个for循环,每个位置上依次比较
这样不知道可不可行

#25


数据量小,范围也小,使用标记的方法就可以

#26


该回复于2010-08-04 17:46:41被版主删除

#27


该回复于2010-08-04 17:46:42被版主删除

#28


该回复于2010-08-04 17:46:42被版主删除

#29


#include <stdio.h>

int main()
{
  int a[10]={1,2,5,8,4,6,5,7,3,5};
  int b[10]={0,2,8,15,14,9,7,13,16,6};
  int c[10]={4,8,6,17,18,6,3,8,5,0};

    int tmp[20]={0};

    int i;
    for( i=0; i<10; i++) tmp[a[i]] |=  0x1;
    for( i=0; i<10; i++) tmp[b[i]] |=  0x10;
    for( i=0; i<10; i++) tmp[c[i]] |=  0x100;

    for( i=0; i<30; i++)
    {
        if( tmp[i] == 0x111 ) printf("%d,", i);
    }
}

#30


#include <stdio.h>

int main()
{
    int a[10]={1,2,5,8,4,6,5,7,3,5};
    int b[10]={0,2,8,15,14,9,7,13,16,6};
    int c[10]={4,8,6,17,18,6,3,8,5,0};

    int tmp[20]={0};

    int i;
    for( i=0; i<10; i++)
    {
        tmp[a[i]] |=  0x1;
        tmp[b[i]] |=  0x10;
        tmp[c[i]] |=  0x100;
    }

    for( i=0; i<30; i++)
    {
        if( tmp[i] == 0x111 ) printf("%d,", i);
    }
}

#31


#include <iostream>
using namespace std;

/*从三个数组中找出相同的数据,找到并输出*/
int main()
{
// int a[10],b[10],c[10];
int temp;
int a[10]={1,2,4,6,8,10,12,14,16,18};
int b[10]={3,5,7,20,1,2,8,13,19,16};
int c[10]={1,2,6,7,5,10,15,14,18,16};
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
{
if(a[i]!=b[j])
continue;
else
  {
  temp=a[i];
        for(int k=0;k<10;k++)
if(temp==c[k])
cout<<"相同的数据是:"<<temp<<endl; 
  }
}


return 0;
}

#32


确定范围是0-19啊
那就for(0-19)
判断每个数字是否在各个数组中也行啊 ,之前最好给数组排个序啥的

#33


10000次以内就别追求什么效率了。

#34



int main()
{
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int c[10] = {10, 11, 12, 13, 14, 15, 16, 17, 18, 5};
int d[20] = {0};
for (int i = 0; i < 10; ++i)
{
++d[a[i]];
++d[b[i]];
++d[c[i]];
}
for (int j = 0; j < 20; ++j)
if (d[j] == 3)
{
printf("%d\n", j);
break;
}
return 0;
}

#35


太棒了 !,谢谢各位了 !

#36


要先感谢郭嘉啊~~

#37


哦 ,都谢,都谢,哈哈