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;
}