C语言-基因序列转换独热码(one-hot code)

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.方法一(二维数组)

比较科学且正常的做法

cpp 复制代码
#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.方法二(一维数组)

纯属瞎捣鼓,不建议......

cpp 复制代码
#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;
}
相关推荐
J2虾虾10 分钟前
C语言 typedef 用法
c语言·数据结构·算法
聆春烟雨簌簌13 分钟前
LangChain4j使用文档
开发语言·python
程序员小羊!14 分钟前
12.Java 多线程编程
java·开发语言
乐观勇敢坚强的老彭20 分钟前
C++信息学奥赛lesson1
java·开发语言·c++
jllllyuz27 分钟前
MATLAB实现滚动轴承故障诊断(外圈故障)
开发语言·人工智能·matlab
github_czy29 分钟前
更加优雅的类型检查与传参---mcp源码分析
java·服务器·开发语言
Irissgwe35 分钟前
C++ STL关联式容器详解:set、multiset、map、multimap
开发语言·c++·stl·set·map·multiset·关联式容器
叶帆44 分钟前
【YFIOs】用C#开发硬件之WiFi网络
开发语言·网络·c#
meilindehuzi_a1 小时前
深入理解 JavaScript 的同步与异步机制:从单线程设计到 Promise 核心应用
开发语言·javascript·ecmascript
WL学习笔记1 小时前
顺序表详解
c语言·数据结构