来源
元培-From WHF
描述
给定两个整数集合,输出交集,输出时,按元素从小到大的顺序输出,以逗号间隔。
注意:给定的集合中可能有重复元素,但输出的交集中不能有重复元素。如果没有交集,则输出 NULL
例:
集合A:1,3,5,6,10,6,8,11
集合B: 2,4,8,6,10,6,12,13
那么,输出为:
6,8,10
关于输入
2行,每行表示一个集合的元素序列,元素之间以逗号间隔,假定每个集合不超出200个元素。
关于输出
两个集合的交集,按元素从小到大输出,以逗号间隔。如果没有交集,则输出 NULL
例子输入
1,3,5,6,10,6,8,11
2,4,8,6,10,6,12,13
例子输出
6,8,10
提示
集合中元素的个数请自己想办法确定
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
using namespace std;
int is_num(char a) {
if (a >= '0' && a <= '9')return 1;
else if (a == '\n')return 2;
else if (a==',')return 0;
}//判断是字符还是数字还是逗号的一个程序(大家应该都看得出来的吧
int main(){
int i = 0;
int a[200] = { 0 };
int b[200] = { 0 };
//存储读入的两个数组
int fin[300] = { 0 };
//存储作为结果的数组(用数组的值作为标记
int count1 = 0;
int count2 = 0;
int x = 0;
int flag = 0;
for (i = 0;; i++) {
char ch;
ch = getchar();//按顺序一次读入字符
if (is_num(ch) == 2) {//读到换行符
if (flag == 0) {
flag = 1;//换到第二个数组读取
a[count1] = x;//把最后一个数字存在第一个数组里
x = 0;//重置
}
else {
b[count2] = x;//把最后一个数字存在第二个数组里
break; //直接结束读取
}
}
if (is_num(ch) == 1) {
x = x * 10 + ch - '0';//向前进位,然后加上新读入的数字
}
else if (is_num(ch) == 0) {//读到了逗号
if (flag == 0) {
a[count1] = x;//把已经读入的数字存起来
x = 0;
count1++;//继续下一个序号
}
else if (flag == 1) {
b[count2] = x;
x = 0;
count2++;
}
}
}
for (i = 0; i <= count1; i++) {
if(fin[a[i]]==0)
fin[a[i]] = 1;//把在第一个数组里出现过的数字标记一下
}
for (i = 0; i <= count2; i++) {
if (fin[b[i]] == 1)fin[b[i]] = 100;//把同时出现过的数字标记一下
else continue;
}
int flag2 = 0;//关于是否输出逗号的格式问题
int flag3=0;
for (i = 0; i < 300; i++) {
if (fin[i] == 100) {
if (flag2 == 0) {
flag2 = 1;
printf("%d", i);
flag3=1;
}
else printf(",%d", i);
flag3=1;
}
}
if(flag3==0)printf("NULL\n");//最后一个符合题意的数都没有,就打印NULL(一定要好好读题啊啊啊啊之前就是因为没有注意到这个情况.最后迫不得已打表了(悲
return 0;
}
虽然打表不好.但是我还是想说编程网格打表就是永远的神(什么啊孩子学坏了