今天给各位分享用c语言编写补集运算的知识,其中也会对c语言补码运算代码进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、用c语言求两个集合的交集,并集,差集2、请高手帮忙一下,c语言,谢谢3、.求c语言高手用c语言编制,跪求 急用
用c语言求两个集合的交集,并集,差集
#include stdio.h
#include string.h
#include conio.h
#define ARR_LEN 255/*数组长度上限*/
#define elemType char/* 集合元素数据类型 */
/* 集合数据结构 */
typedef struct set {
elemType data[ARR_LEN];
int length;
} set;
/* 初始化集合 */
void initSet (set *S) {
S-length = 0;
}
/* 交集 */
/* A与B的交集(A∩B):既属于A又属于B的元素构成的集合 */
int setIntersection (set A, set B, set *dest) {
int i = 0, j = 0, k = 0;
dest-length = 0;
for (i=0; iA.length; i++) { /* 外循环遍历A */
for (j=0; jB.length; j++) { /* 内循环遍历B */
if (A.data[i] == B.data[j]) { /* 既属于A又属于B的元素,存入dest */
dest-data[k] = A.data[i];
k++;
}
}
}
dest-length = k;
if (dest-length)
return 1;
else
return 0;
}
/* 并集 */
/* A与B的并集(A∪B):A与B所有元素构成的集合 */
int setUnion (set A, set B, set *dest) {
int i = 0, j = 0, k = 0;
dest-length = 0;
for (i=0; iA.length; i++) { /* 外循环遍历A */
for (j=0; jB.length; j++) { /* 内循环遍历B */
if (A.data[i] == B.data[j]) /* 既属于A又属于B的元素,跳过 */
break;
}
if (j == B.length) { /* 属于A但不属于B的元素,存入dest */
dest-data[k] = A.data[i];
k++;
}
}
for (j=0; jB.length; j++) { /* B的所有元素,存入dest */
dest-data[k] = B.data[j];
k++;
}
dest-length = k;
if (dest-length)
return 1;
else
return 0;
}
/* 补集 */
/* B在A中的相对补集(A\B):属于A但不属于B的元素构成的集合 */
int setComplement (set A, set B, set *dest) {
int i = 0, j = 0, k = 0;
dest-length = 0;
for (i=0; iA.length; i++) { /* 外循环遍历A */
for (j=0; jB.length; j++) { /* 内循环遍历B */
if (A.data[i] == B.data[j]) /* 既属于A又属于B的元素,跳过 */
break;
}
if (j == B.length) { /* 属于A但不属于B的元素,存入dest */
dest-data[k] = A.data[i];
k++;
}
}
dest-length = k;
if (dest-length)
return 1;
else
return 0;
}
/* 打印集合内容 */
int printSet (set S) {
int i;
if (S.length == 0) {
puts (“The set is empty! “);
return 0;
}
for (i=0; iS.length; i++)
printf (“%c”, S.data[i]);
putchar (‘\n’);
return 1;
}
int main (void) {
set A, B;
set AIB, AUB, ACB; /* 交集、并集、补集 */
initSet (A); initSet (B);
initSet (AIB); initSet (AUB); initSet (ACB);
strcpy (A.data, “123”);
A.length = strlen (A.data);
strcpy (B.data, “4532”);
B.length = strlen (B.data);
printf (“A:\t”);
printSet (A);
printf (“B:\t”);
printSet (B);
putchar (‘\n’);
printf (“A∩B:\t”);
setIntersection (A, B, AIB);
printSet (AIB);
printf (“A∪B:\t”);
setUnion (A, B, AUB);
printSet (AUB);
printf (“A\B:\t”);
setComplement (A, B, ACB);
printSet (ACB);
getch (); /*屏幕暂留*/
return 0;
}
请高手帮忙一下,c语言,谢谢
#includestdio.h
#define M 4
#define N 2
int jiaoji(int a[],int b[],int jiao[])
{int i,j,c=0;
for(i=0;iM;i++)
for(j=0;jN;j++)
if (a[i]==b[j]) jiao[c++]=a[i];
return c;
}
main()
{int a[M]={1,3,7,10},b[N]={1,10};
int jiao[M];
int exit,k;
k=jiaoji(a,b,jiao);
for(int i=0;ik;i++)
{
printf(“%d”,jiao[i]);
printf(“\n”);
}
printf(“please press any key exit”);
scanf(“%d”,exit);
}
数组jiao[]用于存放交集,当if (a[i]==b[j]) jiao[c++]=a[i];判断是否有相同的数,有的话就存入jiao[];
变量c,用于统计交集个数的大小;并将它返回到主函数变量k中;
变量exit的用途是,观察结果,并按任意键退出
.求c语言高手用c语言编制,跪求 急用
并就是将两个链表连在一起,并去除重复元素。
新建一个链表,把两个链表中的元素依次放进去。
只需遍历一次,时间复杂度O(N).
伪代码如下(抱歉我不会写C,不过语言的实现是不难的,算法才是关键):
Create NewList;
while(List1 is not empty List 2 is not empty){
if(elementInList1 elementInList2){
Create new node Copy elementInList2 in NewList;
++head2;
}else if(elementInList1 elementInList2){
Create new node Copy elementInList1 in NewList;
++head1;
}else{
//The elements are identical, just save one
Create new node Add elementInList1 in NewList;
++head1;++head2;
}
}
//Merge the left sequence
if(List1 is not empty) Merge List1 To new List1
if(List2 is not empty) Merge List2 To new List2
Merge(OldList, NewList){
while(OldList is not empty){
Create new node in NewList;
Copy the current node from OldList to NewList;
}
NewList.tail = NULL;
}
求差A\B,可以先将B中的元素全部存入一个临时数组中。然后遍历A,对A的每个节点,用二分查找法查看其在B中是否出现过(链表不能随机访问,无法实现二分查找),若未出现过,则将其复制一份到新链表中。这样的时间复杂度为O(NlogN);
求交时可以采用和求并的算法相似的手段,按大小顺序遍历,当两个链表表头元素相同时,便记录下来,即可。
集合的子集判定,可以求B与A交B的差,若差为空表,则B是A的子集。
元素表示就是顺序访问链表,没什么好说。
至于求补集,就是求全集U与给定集合的差集。当然也有一种更高效的算法
假设U代表从1到10000的所有正整数。A是给定的正整数集合
建立一个长为10002的标记数组int[] isElementA = new int[10002];
先全部置成0.
遍历A链表,用标记数组中的下标记录元素的出现情况
就是isElementA[curNode – data] = 1;
之后从下标1到10000逐个查看,若里面的标记为0,则这个元素属于A的补集,记录下来就好
这样只用遍历一遍链表即可,时间复杂度提升至O(N)
关于用c语言编写补集运算和c语言补码运算代码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。