你的任务是对一些DNA的字母序列按无序度进行排序(DNA字母序列只含A T G C四种字母),无序度小的序列排在前面。
输入
输入由多组测试数据组成。每组测试数据的第一行为两个数n和m,0<n<=50,0<m<=100。n表示每个序列的长度(同一组测试数据中各序列的长度都为n),m表示此组测试数据中的序列个数。接下来有m行,每行为一个长度为n的DNA字母序列。
输出
对于每组测试数据,输出排序后的序列列表。在排序时,无序度小的序列排在前面。如果两个序列的无序度相等,那么它们在列表中出现的顺序和它们在输入中的顺序相同。
在每组测试数据后输出一行“********************”(二十个星号)。
#include<stdio.h>
int main(int argc, char* argv[])
{
int n,m;
char **str;
char a[4];
int pos;
int c;
int i=0,j=0;
int jishu[110];
/*//"ACGT";*/
while(scanf("%d %d",&m,&n)==2)
{
i=0;
//str=new char*[n];
for(;i<n;i++)
{
str[i]=new char[m+1];
scanf("%s",str[i]);
str[i][m]='\0';
a[0]=0;
a[1]=0;
a[2]=0;
a[3]=0;
c=0;
for( j=0;j<m;j++)
{
switch(str[i][j])
{
case 'A':pos=0;
break;
case 'C':pos=1;
break;
case 'G':pos=2;
break;
case 'T':pos=3;
break;
default;
}
a[pos]++;
for(int k=3;k>pos;k--)
{
if(a[k]!=0)
c+=a[k];
}
}
jishu[i]=c;
}
int tmp;
char *p;
int k;
//插入排序
for( i=0;i<n-1;i++)
{
k=i;
for( j=i+1;j<n;j++)
{
if(jishu[k]>jishu[j])
{
k=j;
}
}
if(k!=i)
{
tmp=jishu[k];
p=str[k];
for(j=k;j>i;j--)
{
jishu[j]=jishu[j-1];
str[j]=str[j-1];
}
jishu[i]=tmp;
str[i]=p;
}
}
for(int i=0;i<n;i++)
{
printf("%s\n",str[i]);
}
printf("********************\n");
for( i=0;i<n;i++)
{
delete []str[i];
}
delete []str;
}
return 0;
}
5 个解决方案
#1
只看了一部分看不下去了~~~
for( j=0;j <m;j++)
{
switch(str[i][j])
{
case 'A':pos=0;
break;
case 'C':pos=1;
break;
case 'G':pos=2;
break;
case 'T':pos=3;
break;
default;
}
a[pos]++;
做什么用?查找每个字母有多少个?找他做什么,不是要比较吗?既然比较就做差啊.
用第一个和后面的差,然后用第二个和后面的差.这样做出来数,送给一个int型数组.然后用这个数据给srt排序
for( j=0;j <m;j++)
{
switch(str[i][j])
{
case 'A':pos=0;
break;
case 'C':pos=1;
break;
case 'G':pos=2;
break;
case 'T':pos=3;
break;
default;
}
a[pos]++;
做什么用?查找每个字母有多少个?找他做什么,不是要比较吗?既然比较就做差啊.
用第一个和后面的差,然后用第二个和后面的差.这样做出来数,送给一个int型数组.然后用这个数据给srt排序
#2
问题是什么?!
#3
写的不明白, 设串char str[] = "AGTC" \
int a,i,j;
for (i = 0; i < n-1; i++)
for (j = i+1; j < n; j++)
if (str[i]-str[j]>0)
a++;
#4
改了一下楼主的代码。
已经面目全非了!呵呵!!
我试了一下,应该没什么问题。。。。。。
已经面目全非了!呵呵!!
我试了一下,应该没什么问题。。。。。。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int n,m;
char *str[50];
char a[4];
int pos;
int c;
int i = 0, j = 0;
int jishu[110] = {0};
//Add some variables.
char TempChar;
int index;
int k;
int tmp;
char *p;
/*//"ACGT";*/
while( scanf("%d %d",&m,&n) == 2 )
{
//str=new char*[n];
for( i = 0; i < n; i++ )
{
/*str[i]=new char[m+1]; */
str[i] = (char*) malloc ( sizeof(char) * (m+1));
scanf("%s", str[i]);
str[i][m] = '\0';
for( j = 0; j < m; j++)
{
TempChar = str[i][j];
for ( index = j+1; index < m; index++)
if ( TempChar > str[i][index] )
jishu[i] ++;
}
/*
a[0]=0;
a[1]=0;
a[2]=0;
a[3]=0;
c=0;
for( j=0;j <m;j++)
{
switch(str[i][j])
{
case 'A':pos=0;
break;
case 'C':pos=1;
break;
case 'G':pos=2;
break;
case 'T':pos=3;
break;
default:
printf("Error!\n"); //Error condition.
break;
}
a[pos]++;
//for(int k=3;k>pos;k--)
for(k = 3; k > pos; k--)
{
if(a[k]!=0)
c+=a[k];
}
}
jishu[i]=c;
*/
}
/*
int tmp;
char *p;
int k;
*/
//插入排序
for( i = 0; i < n-1; i++)
{
k = i;
for( j = i+1; j < n; j++)
{
if(jishu[k] > jishu[j])
{
k = j;
}
}
if( k != i )
{
tmp=jishu[k];
p=str[k];
for(j=k;j>i;j--)
{
jishu[j]=jishu[j-1];
str[j]=str[j-1];
}
jishu[i]=tmp;
str[i]=p;
}
}
for(i=0;i <n;i++)
{
printf("%s\n",str[i]);
}
printf("********************\n");
/*
for( i=0;i <n;i++)
{
delete []str[i];
}
delete []str; */
for( i=0;i <n;i++)
free (str[i]);
}
return 0;
}
#5
谢谢各位,我自己改好了,上面的仁兄很强,谢谢了。
#1
只看了一部分看不下去了~~~
for( j=0;j <m;j++)
{
switch(str[i][j])
{
case 'A':pos=0;
break;
case 'C':pos=1;
break;
case 'G':pos=2;
break;
case 'T':pos=3;
break;
default;
}
a[pos]++;
做什么用?查找每个字母有多少个?找他做什么,不是要比较吗?既然比较就做差啊.
用第一个和后面的差,然后用第二个和后面的差.这样做出来数,送给一个int型数组.然后用这个数据给srt排序
for( j=0;j <m;j++)
{
switch(str[i][j])
{
case 'A':pos=0;
break;
case 'C':pos=1;
break;
case 'G':pos=2;
break;
case 'T':pos=3;
break;
default;
}
a[pos]++;
做什么用?查找每个字母有多少个?找他做什么,不是要比较吗?既然比较就做差啊.
用第一个和后面的差,然后用第二个和后面的差.这样做出来数,送给一个int型数组.然后用这个数据给srt排序
#2
问题是什么?!
#3
写的不明白, 设串char str[] = "AGTC" \
int a,i,j;
for (i = 0; i < n-1; i++)
for (j = i+1; j < n; j++)
if (str[i]-str[j]>0)
a++;
#4
改了一下楼主的代码。
已经面目全非了!呵呵!!
我试了一下,应该没什么问题。。。。。。
已经面目全非了!呵呵!!
我试了一下,应该没什么问题。。。。。。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int n,m;
char *str[50];
char a[4];
int pos;
int c;
int i = 0, j = 0;
int jishu[110] = {0};
//Add some variables.
char TempChar;
int index;
int k;
int tmp;
char *p;
/*//"ACGT";*/
while( scanf("%d %d",&m,&n) == 2 )
{
//str=new char*[n];
for( i = 0; i < n; i++ )
{
/*str[i]=new char[m+1]; */
str[i] = (char*) malloc ( sizeof(char) * (m+1));
scanf("%s", str[i]);
str[i][m] = '\0';
for( j = 0; j < m; j++)
{
TempChar = str[i][j];
for ( index = j+1; index < m; index++)
if ( TempChar > str[i][index] )
jishu[i] ++;
}
/*
a[0]=0;
a[1]=0;
a[2]=0;
a[3]=0;
c=0;
for( j=0;j <m;j++)
{
switch(str[i][j])
{
case 'A':pos=0;
break;
case 'C':pos=1;
break;
case 'G':pos=2;
break;
case 'T':pos=3;
break;
default:
printf("Error!\n"); //Error condition.
break;
}
a[pos]++;
//for(int k=3;k>pos;k--)
for(k = 3; k > pos; k--)
{
if(a[k]!=0)
c+=a[k];
}
}
jishu[i]=c;
*/
}
/*
int tmp;
char *p;
int k;
*/
//插入排序
for( i = 0; i < n-1; i++)
{
k = i;
for( j = i+1; j < n; j++)
{
if(jishu[k] > jishu[j])
{
k = j;
}
}
if( k != i )
{
tmp=jishu[k];
p=str[k];
for(j=k;j>i;j--)
{
jishu[j]=jishu[j-1];
str[j]=str[j-1];
}
jishu[i]=tmp;
str[i]=p;
}
}
for(i=0;i <n;i++)
{
printf("%s\n",str[i]);
}
printf("********************\n");
/*
for( i=0;i <n;i++)
{
delete []str[i];
}
delete []str; */
for( i=0;i <n;i++)
free (str[i]);
}
return 0;
}
#5
谢谢各位,我自己改好了,上面的仁兄很强,谢谢了。