问题描述
判断函数的单射、满射与双射
设在某变化过程中有两个集合X、Y,如果对于X内的每一个确定的值,Y都有唯一确定的值与它对应,那么就称y是x的函数(function),x叫做自变量。
单射(injective function):若对X中任意两个不同元素x1,x2. x1不等于x2,他们在Y中的像都不相等(他们在Y中对应的值都不相等),这是单射。
满射(surjective function)::Y中的任何一个元素都是X中某元素的像(Y中任意元素都有X中的元素来对应),这是满射。
双射(bijective function):也叫一一映射,既满足单射又满足满射就叫双射。
如何判断一个函数是那种类型的函数让何剑犯了难,你能设计一个程序来帮他解决这个问题吗?
输入
先输出两行,输入两个集合X,Y;
然后接下来每行都输入两个数,分别为X中元素 和对应Y中的元素,表示X中该元素与Y中该元素。
最后一行输入 -1 表示输入完毕
输出
判断给出的对应关系;
若不是函数,则输出 "It is not a fuction”;
如果是单射函数,则输出 "injective function";
如果是满射函数,则输出"surjective function";
如果是双射函数(既满足单射又满足满射),则输出"bijective function"。
输入样例
1 2 3
A B C D
1 A
2 B
3 C
-1
输出样例
injective function
代码
#include <stdio.h>
#include <string.h>
int main () {
char X[1000],Y[1000];
char rubbish;
int num1 = 0,num2 = 0;
for (int i = 0;i < 1000;i++) {
X[i] = getchar();
num1++;
rubbish = getchar();
if (rubbish == '\n') break;
}
for (int i = 0;i < 1000;i++) {
Y[i] = getchar();
rubbish = getchar();
if (rubbish == '\n') break;
}
fflush(stdin);
char b[1000];
for (int i = 0;i < 1000;i++) {
int a;
scanf("%d",&a);
char rubbish2 = getchar();
if (a == -1) {
break;
}
b[i] = getchar();
num2++;
}
int flag1 = 1,flag2 = 1;
int n = strlen(b),m = strlen(Y);
if (num1 == num2) {
for (int i = 0;i < n;i++) {
for (int j = 0;j < n;j++) {
if (b[i] == b[j] && i != j) {
flag1 = 0;
goto hhh;
}
}
}
hhh:
for (int i = 0;i < m;i++) {
if (flag2 != 1) {
break;
}
else {
flag2 = 0;
}
for (int j = 0;j < n;j++) {
if (Y[i] == b[j]) {
flag2 = 1;
break;
}
}
}
}
else {
printf ("It is not a fuction");
flag1 = 0;flag2 = 0;
}
if (flag1 == 1 && flag2 == 1) {
printf ("bijective function");
}
else if (flag1 == 1)
printf ("injective function");
else if (flag2 == 1) {
printf ("surjective function");
}
return 0;
}