DNA算法

   主要输入字符串,以字符串的逆叙述排序,题目出自poj1007。

源代码如下:

#include <iostream>
#include <string>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;

int calcnum(char * s,int column);

int main() {
    int column,line;
    int i,j,k,l;
    int a[100];
    char s[100][100];
    char * temp=new char[100];
    cin>>column>>line;
    for(i=0;i<line;i++){
        for(j=0;j<column;j++){
            cin>>s[i][j];
        }
    }
    for(i=0;i<line;i++){
        a[i]=calcnum(s[i],column);
    }
    for(i=0;i<line-1;i++){                                      //据逆序数排序(DESC)
        k=i;
        for(j=i+1;j<=line-1;j++){
            if(a[k]>a[j]){
                k=j;
            }
        }
        if(k!=i){
            strcpy(temp,s[i]);strcpy(s[i],s[k]);strcpy(s[k],temp);
            l=a[i];a[i]=a[k];a[k]=l;  //少这一句真是太坑爹了!
        }
    }
    for(i=0;i<line;i++){
        for(j=0;j<column;j++){
            cout<<s[i][j];
        }
        cout<<endl;
    }
    delete temp;
    return 0;
}

int calcnum(char * s,int column){             //求逆序数;
    int i,j;
    int count=0;
    for(i=0;i<column-1;i++){
        switch(s[i]){
            case 'A':break;
            case 'C':
                for(j=i+1;j<column;j++){         
                    if(s[j]=='A'){
                        count++;
                    }
                }
                break;
            case 'G':
                for(j=i+1;j<column;j++){
                    if(s[j]=='A' || s[j]=='C'){
                        count++;
                    }
                }
                break;
            case 'T':
                for(j=i+1;j<column;j++){
                    if(s[j]=='A' || s[j]=='C' || s[j]=='G'){
                        count++;
                    }
                }
                break;
            default:break;
        }
    }
    return count;
}
本人小菜,以C++的格式编写了C的代码,排序完全可以用sort的,这些学过再改吧!



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值