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;
}
相关推荐
黑听人5 分钟前
【力扣 困难 C】115. 不同的子序列
c语言·leetcode
witton1 小时前
Go语言网络游戏服务器模块化编程
服务器·开发语言·游戏·golang·origin·模块化·耦合
枯萎穿心攻击2 小时前
ECS由浅入深第三节:进阶?System 的行为与复杂交互模式
开发语言·unity·c#·游戏引擎
Jerry Lau2 小时前
go go go 出发咯 - go web开发入门系列(一) helloworld
开发语言·前端·golang
nananaij2 小时前
【Python基础入门 re模块实现正则表达式操作】
开发语言·python·正则表达式
Micro麦可乐2 小时前
Java常用加密算法详解与实战代码 - 附可直接运行的测试示例
java·开发语言·加密算法·aes加解密·rsa加解密·hash算法
天下一般2 小时前
go入门 - day1 - 环境搭建
开发语言·后端·golang
雷羿 LexChien2 小时前
C++内存泄漏排查
开发语言·c++
水果里面有苹果3 小时前
17-C#的socket通信TCP-1
开发语言·tcp/ip·c#
手握风云-3 小时前
JavaEE初阶第七期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(五)
java·开发语言