给定三个自然数数组(长度为1-100),求在三个数组中都存在的元素,-1表示三个数组没有公共元素

cjl1166 2013-04-14 10:04:43
Input



第1行:整数T(1≤T≤10)为问题数

第2行,以空格隔开的三个数组的长度

第3行,以空格隔开的第一个数组

第4行,以空格隔开的第二个数组

第5行,以空格隔开的第三个数组

第6 ∽ 4*T+1行:后面每一个问题中的数据,格式与第一个问题相同。


Output



对于每个问题,输出一行问题的编号(0开始编号,格式:case #0: 等),然后在一行中按从小到大的顺序输出三个数组的公共元素,元素间以空格隔开,最后一个元素后没有空格但有回车。如果三个数组中没有公共元素,则输出-1。


Sample Input



4

2 3 4

0 3

4 3 0

3 9 0 7

3 2 4

3 2 9

1 4

3 2 8 7

9 8 7

9 8 7 6 5 4 3 2 1

9 8 7 6 5 4 3 2

9 8 7 6 5 4 3

30 25 35

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

8 9 1 5 10 20 43 42 21 22 23 12 13 41 40 39 14 2 6 7 3 4 19 45 44

8 9 1 2 6 7 3 4 5 10 20 21 22 23 12 13 14 19 25 27 31 24 11 15 16 28 17 18 29 30 35 33 26 34 32


Sample Output



case #0:

0 3

case #1:

-1

case #2:

3 4 5 6 7 8 9

case #3:

1 2 3 4 5 6 7 8 9 10 12 13 14 19 20 21 22 23
我的代码
#include<stdio.h>
#include<malloc.h>
int main()
{
int *a,*b,*c;
int d[100]={-1};
int i,j,k,l,h,g,e,f,y,temp;
scanf("%d",&l);
for(i=0;i<l;i++)
{
scanf("%d%d%d",&g,&e,&f);y=0;
a= (int *) malloc(g* sizeof(int) );
b= (int *) malloc(g* sizeof(int) );
c= (int *) malloc(g* sizeof(int) );
for(j=0;j<g;j++)
scanf("%d",&a[j]);
for(k=0;k<e;k++)
scanf("%d",&b[j]);
for(h=0;h<f;h++)
scanf("%d",&c[h]);
for(j=0;j<g;j++)
for(k=0;k<e;k++)
for(h=0;h<f;h++)
if(a[j]==b[k]==c[h])
{d[y]=a[j];y++;}
y--;
for(j=0;j<y-1;j++) {
k=j;
for(h=j+1;h<y;h++)
if(d[k]>d[h]) k=h;
if(j!=k) {
temp=d[j];
d[j]=d[k];
d[k]=temp;
}
}
printf("case #%d:\n",i);
for(j=0;j<y-1;j++)
printf("%d ",d[j]);
printf("%d\n",d[j]);
}
return 0;
}

求教了,,谢谢
...全文
223 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2013-04-16
  • 打赏
  • 举报
回复
问题的解决从代码的格式化开始。

# include <stdio.h>
# include <malloc.h> // malloc在stdlib.h中声明

int main()
{
    int *a, *b, *c;
    int d[100] = { -1 }; // 除了第0个元素是-1,其他元素都是0;另外题目也没有100的限制,也没有正负数的限制
    int i, j, k, l, h, g, e, f, y, temp; // 到后面就基本不知道哪个变量是干什么的了
    scanf("%d", &l);
    for (i = 0; i < l; i++)
    {
        scanf("%d%d%d", &g, &e, &f);
        y = 0;
        a = (int *)malloc(g * sizeof(int));
        b = (int *)malloc(g * sizeof(int)); // g应该是e
        c = (int *)malloc(g * sizeof(int)); // g应该是f
        for (j = 0; j < g; j++)
            scanf("%d", &a[j]);
        for (k = 0; k < e; k++)
            scanf("%d", &b[j]);
        for (h = 0; h < f; h++)
            scanf("%d", &c[h]);
        for (j = 0; j < g; j++)
            for (k = 0; k < e; k++)
                for (h = 0; h < f; h++) // 注意如果维度较大,三重循环(a * b * c)就是较大的循环次数,可能会超时
                    if(a[j] == b[k] == c[h]) // 这里应该写成a[j] == b[k] && b[k] == c[h]
                    {
                        d[y] = a[j];
                        y++;
                    }
        y--;
        for (j = 0; j < y - 1; j++) // 想做冒泡排序?
        {
            k = j;
            for (h = j + 1; h < y; h++)
                if (d[k] > d[h])
                    k = h;
            if (j != k)
            {
                temp = d[j];
                d[j] = d[k];
                d[k] = temp;
            }
        }
        printf("case #%d:\n", i);
        for (j = 0; j < y - 1; j++)
            printf("%d ", d[j]);
        printf("%d\n", d[j]);
    }

    return 0;
}
ForestDB 2013-04-16
  • 打赏
  • 举报
回复

# include <iostream>
# include <vector>
# include <set>
# include <algorithm>

using namespace std;

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        int a, b, c, tmp;
        cin >> a >> b >> c;
        vector<int> va, vb, vc;
        for (int j = 0; j < a; j++)
        {
            cin >> tmp;
            va.push_back(tmp);
        }
        for (int j = 0; j < b; j++)
        {
            cin >> tmp;
            vb.push_back(tmp);
        }
        for (int j = 0; j < c; j++)
        {
            cin >> tmp;
            vc.push_back(tmp);
        }
        set<int>
            sa(va.begin(), va.end()),
            sb(vb.begin(), vb.end()),
            sc(vc.begin(), vc.end());
        vector<int> vtmp, vtmp1;
        set_intersection(
            sa.begin(), sa.end(),
            sb.begin(), sb.end(),
            back_inserter(vtmp));
        set_intersection(
            sc.begin(), sc.end(),
            vtmp.begin(), vtmp.end(),
            back_inserter(vtmp1));
        cout << "case #" << i << ':' << endl;
        if (vtmp1.empty())
            cout << -1 << endl;
        else
        {
            cout << vtmp1[0];
            for (size_t j = 1; j < vtmp1.size(); j++)
                cout << ' ' << vtmp1[j];
            cout << endl;
        }
    }

    return 0;
}
wcwswswws3 2013-04-15
  • 打赏
  • 举报
回复
……贴算法题(这种称不上ACM)请用去hdu之类专门的地方……或者你至少应该用正确的方法贴代码……
buyong 2013-04-14
  • 打赏
  • 举报
回复
第6 ∽ 4*T+1行:后面每一个问题中的数据,格式与第一个问题相同。 问题中的数据,是干什么用的。题没看懂。能不能写出给定例子的预期结果?

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧