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;
}
相关推荐
古城小栈4 分钟前
Rust Tauri:构建轻量高性能跨平台桌面应用
开发语言·后端·rust
Chase_______10 分钟前
【Java杂项】String 为什么不可变?从对象引用、常量池到字符串拼接讲清楚
java·开发语言
xwjalyf16 分钟前
javascript数组 forEach,filter,some,every,map,find,reduce的用法与区别
开发语言·javascript·json·ecmascript
qq_25183645718 分钟前
基于java Web 耗材购置与维修网络申报审批系统设计与实现
java·开发语言·前端
AI玫瑰助手22 分钟前
Python函数:def定义函数与参数传递基础
android·开发语言·python
剑傲娇25 分钟前
【计算机组成原理】 C与汇编的「对话」
服务器·开发语言·缓存
生活爱好者!26 分钟前
用NAS进行漫画创作!一键部署Open WebUI
java·服务器·开发语言·安全·docker
charlie11451419130 分钟前
现代C++特性指南(5)——RAII 深入理解:资源管理的基石
开发语言·c++·现代c++
至为芯1 小时前
IP5356H_G3至为芯支持C口双向快充22.5W新国标移动电源方案芯片
c语言·开发语言