大家看一看这道题怎么修改啊!麻烦

时间:2021-06-02 14:10:07
题目:一种度量序列的“无序度”的方法是计算序列中的逆序元素对的数目。比如,对字母序列“DAABEC”来说,“无序度”为5,因为“D”的右边有4个字母比D“小”(即在字母表中应该排在D前面),“E”的右边有1个字母比E小。相应地,序列“AACEDGG”的无序度为1(只有“E”和“D”为逆序元素对)“ZWQM”的无序度为6。
    你的任务是对一些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排序

#2


问题是什么?!

#3


引用 1 楼 cn34l 的回复:
只看了一部分看不下去了~~~ 
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排序

写的不明白, 设串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排序

#2


问题是什么?!

#3


引用 1 楼 cn34l 的回复:
只看了一部分看不下去了~~~ 
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排序

写的不明白, 设串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


谢谢各位,我自己改好了,上面的仁兄很强,谢谢了。