分析:读完题目后,你是不是可以发现,只要比较每一个DNA序列的相同位置上的字母就可以了,即我们要找的新序列,就是相应位置上,出现次数最多的那一只!比如说,每个序列的第一个字母中,A ,G, C,T出现的次数分别是6,1,1,1,那么,我们要找的新的序列的第一个字母就是A,如果有出现次数相同的,那就需要按字典序来决定选哪一只啦,具体看代码
传 代 码!威~武。。。
#include<stdio.h>
#include<string.h>
#define maxn1 55
#define maxn2 1005
char s[maxn1][maxn2];
int tot[4];
int main(){
int m,n;
scanf("%d %d",&m,&n);
int i,j,k,l,tem,p;
char d;
char NDNA[maxn2];
for(i=0;i<m;i++){
scanf("%s",&s[i]);
}
for(i=0;i<n;i++){//注意一下这两个for循环的顺序哦,不要弄反了
char DNA[4]={'A','C','G','T'};//这里是解决问题的关键!注意我们每次定义这个字符数组的时候,位置就是按照字典序来排的 即A C G T
memset(tot,0,sizeof(tot));
for(j=0;j<m;j++){//来计算每个字母出现的次数,而且,数字的第一个表示的是A的次数,第二个是C的次数,一定要一一对应
if(s[j][i]=='A')
tot[0]++;
if(s[j][i]=='C')
tot[1]++;
if(s[j][i]=='G')
tot[2]++;
if(s[j][i]=='T')
tot[3]++;
}
for(k=0;k<4;k++){
//按照选择排序的方法,从到小排一下序
tem=k;
for(l=k+1;l<4;l++)
if(tot[tem]<tot[l])//注意注意,这里是严格的小于,不能<=,这样才能按字典序哦
tem=l;
if(tem!=k){
d=DNA[tem];DNA[tem]=DNA[k];DNA[k]=d;
}
}
NDNA[i]=DNA[0];//每一次完成之后,都选出现次数最多的那一只
}
NDNA[i]='\0';
printf("%s\n",NDNA);
return 0;
}
如果有不同的想法的,欢迎一起讨论鸭!