1.题目要求
(语言: C)在生物信息学家处理基因序列时,经常需要将基因序列转化为独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。 如基因序列有四种状态,ATCG。分别可以转化为0001,0010,0100,1000。 如果遇到其他字符,则转化为0000。如遇到atcg,也转化为0001,0010,0100,1000。 请一次性输入若干段序列,并输入这些序列的独热码。(因段数以及序列长度不确定,需要使用动态数组,测试用例中每行长度不超过20) 如 输入: 2 ATCG AAAA 输出: 0001001001001000 0001000100010001
2.代码实现
1.方法一(二维数组)
比较科学且正常的做法
#include <stdio.h>
#include <string.h>
void convert(char *sequence, char result[][5]);
int main() {
int n;
scanf("%d", &n);
char sequences[20][20];
char results[20][20 * 4];
for (int i = 0; i < n; i++) {
scanf("%s", sequences[i]);
convert(sequences[i], (char (*)[5])results[i]);
printf("%s\n", results[i]);
}
return 0;
}
void convert(char *sequence, char result[][5]) {
int len = strlen(sequence);
for (int i = 0; i < len; i++) {
switch (sequence[i]) {
case 'A':
strcpy(result[i], "0001");
break;
case 'T':
strcpy(result[i], "0010");
break;
case 'C':
strcpy(result[i], "0100");
break;
case 'G':
strcpy(result[i], "1000");
break;
default:
strcpy(result[i], "0000");
}
}
}
2.方法二(一维数组)
纯属瞎捣鼓,不建议......
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
int count = 0;
// 提示输入要处理的序列数量
printf("请输入要处理的序列数量:");
scanf("%d", &n);
// 提示输入 n 段基因序列
printf("请输入%d段基因序列:\n", n);
char *array = (char *)malloc(n * 21 * sizeof(char));
for (int i = 0; i < n * 20; i++) {
scanf("%c", &array[i]);
if (array[i] == '\n') {
array[i] = '0';
count++;
}
if (count > n) {
break;
}
}
int countPRO = 0;
// 输出独热码的提示
printf("独热码如下:\n");
for (int i = 0; i < n * 20; i++) {
if (array[i] == 'A' || array[i] == 'a') {
printf("0001");
} else if (array[i] == 'T' || array[i] == 't') {
printf("0010");
} else if (array[i] == 'C' || array[i] == 'c') {
printf("0100");
} else if (array[i] == 'G' || array[i] == 'g') {
printf("1000");
} else if (array[i]!= '0') {
printf("0000");
} else {
if (i!= 0 && countPRO!= n) {
printf("\n");
}
countPRO++;
}
if (countPRO > n) {
break;
}
}
free(array);
return 0;
}