Description
限制酶SmaⅠ可识别的脱氧核苷酸序列为CCCGGG,并切割C-G处磷酸二酯键。现实验室拟使用人工法逆序连接充分切割后的DNA片段。请设计程序,给出重组后的DNA序列。
Input
共两行,两个字符串,即切割前DNA双链的脱氧核苷酸序列.
Output
共两行,输出重组后的DNA双链的脱氧核苷酸序列.
Sample Input
ACCCGGGTCCCGGGTT
TGGGCCCAGGGCCCAA
Sample Output
GGGTTGGGTCCCACCC
CCCAACCCAGGGTGGG
Hint
样例中切割片段依次为:
ACCC GGGTCCC GGGTT
TGGG CCCAGGG CCCAA
逆序连接后的DNA序列为:
GGGTT|GGGTCCC|ACCC
CCCAA|CCCAGGG|TGGG
保证输入DNA序列长度不超过100,且字符串仅含A、T、C、G四个字符。
切割和重组操作是独立的,即重组DNA允许含有CCCGGG序列。
# include<stdio.h>
# include<string.h>
/*Description
限制酶SmaⅠ可识别的脱氧核苷酸序列为CCCGGG,并切割C-G处磷酸二酯键。
现实验室拟使用人工法逆序连接充分切割后的DNA片段。请设计程序,给出重组后的DNA序列。
Input共两行,两个字符串,即切割前DNA双链的脱氧核苷酸序列.
Output共两行,输出重组后的DNA双链的脱氧核苷酸序列.
Sample Input
ACCCGGGTCCCGGGTT
TGGGCCCAGGGCCCAA
Sample Output
GGGTTGGGTCCCACCC
CCCAACCCAGGGTGGG
Hint
样例中切割片段依次为:
ACCC GGGTCCC GGGTT
TGGG CCCAGGG CCCAA
逆序连接后的DNA序列为:
GGGTT|GGGTCCC|ACCC
CCCAA|CCCAGGG|TGGG
保证输入DNA序列长度不超过100,且字符串仅含A、T、C、G四个字符。
切割和重组操作是独立的,即重组DNA允许含有CCCGGG序列。
*/
int main()
{
char a1[100], a2[100], b1[100], b2[100];
gets(a1);
gets(a2);//读取两行DNA
int n = strlen(a1);//DNA长度
int k = 0;
for (int i = 3;i <= n - 3;i ++)
{
if ((a1[i - 3] == 'C' && a1[i - 2] == 'C' && a1[i - 1] == 'C'
&& a1[i] == 'G' && a1[i + 1] == 'G' && a1[i +2] == 'G') ||
(a1[i - 3] == 'G' && a1[i - 2] == 'G' && a1[i - 1] == 'G'
&& a1[i] == 'C' && a1[i + 1] == 'C' && a1[i +2] == 'C') )//检测可识别的核酸序列
//检测出的地址第即i——核酸序列的第4个碱基对(也可以用strstr函数找第一个碱基对
{
for (int j = k;j < i;j ++)//这个循环用于逆序操作,操作的碱基对为上一个检测到的地址到
//这一次检测到的地址之前
{
b1[j + n - i - k] = a1[j];//可以看出,b1是从n-i开始遍历,a1从i开始遍历
//第一位的地址(中心对称)
b2[j + n - i - k] = a2[j];
}
k = i;
}
}
for (int j = k;j < n;j ++)//最后一段无法通过上面的循环交换顺序 (由于上面的循环操作的碱基对
{
b1[j - k] = a1[j];//操作最后一段碱基对
b2[j - k] = a2[j];
}
b1[n] = '\0';//给字符数组加上\0,使其成为字符串,再打印
puts(b1);//puts函数自带换行
b2[n] = '\0';
puts(b2);
return 0;
}