模拟棋盘法计算遗传中概率

#include<cstdio>
#include<cstring>
using namespace std;
int m[5][5],w[3][3],s[10],b[3][3],c[5],ans[10][10];
char fa[100],ma[100],qu[100];
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
int main()
{
    int tar;
    printf("请输入亲本基因类型:\n");
    printf("父本:"); scanf("%s",fa); printf("\n");
    for (int i=0;i<strlen(fa);i++)
      if (fa[i]==‘M‘) b[1][1]++;
      else if (fa[i]==‘m‘) b[1][2]++;
      else if (fa[i]==‘X‘ && fa[i+2]==‘A‘) m[1][1]++,i+=3;
      else if (fa[i]==‘X‘ && fa[i+2]==‘a‘) m[1][2]++,i+=3;
      else if (fa[i]==‘Y‘ && fa[i+2]==‘A‘) m[2][1]++,i+=3;
      else if (fa[i]==‘Y‘ && fa[i+2]==‘a‘) m[2][2]++,i+=3;
    printf("母本:"); scanf("%s",ma); printf("\n");
    for (int i=0;i<strlen(ma);i++)
      if (ma[i]==‘M‘) b[2][1]++;
      else if (ma[i]==‘m‘) b[2][2]++;
      else if (ma[i]==‘X‘ && ma[i+2]==‘A‘) w[1][1]++,i+=3;
      else if (ma[i]==‘X‘ && ma[i+2]==‘a‘) w[1][2]++,i+=3;
    printf("请输入第几代:"); scanf("%d",&tar); printf("\n");
    for (int i=1;i<=tar;i++)
    {
         s[1]=m[1][1]*w[1][1];
         s[2]=m[1][2]*w[1][1]+m[1][1]*w[1][2];
         s[3]=m[1][2]*w[1][2];
         s[4]=m[2][1]*w[1][1];
         s[5]=m[2][2]*w[1][1];
         s[6]=m[2][1]*w[1][2];
         s[7]=m[2][2]*w[1][2];

         c[1]=b[1][1]*b[2][1];
         c[2]=b[1][1]*b[2][2]+b[1][2]*b[2][1];
         c[3]=b[1][2]*b[2][2];

         for (int j=1;j<=3;j++)
           for (int k=1;k<=7;k++)
             ans[j][k]=c[j]*s[k];

         int ggcd;
         m[1][1]=ans[1][4]+ans[2][4]+ans[3][4]+ans[1][5]+ans[2][5]+ans[3][5];
         m[1][2]=ans[1][6]+ans[2][6]+ans[3][6]+ans[1][7]+ans[2][7]; ggcd=gcd(m[1][1],m[1][2]);
         m[2][1]=ans[1][4]+ans[2][4]+ans[3][4]+ans[1][6]+ans[2][6]+ans[3][6]; ggcd=gcd(ggcd,m[2][1]);
         m[2][2]=ans[1][5]+ans[2][5]+ans[3][5]+ans[1][7]+ans[2][7]; ggcd=gcd(ggcd,m[2][2]);
         m[1][1]/=ggcd; m[1][2]/=ggcd; m[2][1]/=ggcd; m[2][2]/=ggcd;
         w[1][1]=(ans[1][1]+ans[2][1]+ans[3][1])*2+ans[1][2]+ans[2][2]+ans[3][2];
         w[1][2]=ans[1][2]+ans[2][2]+ans[3][2]+(ans[1][3]+ans[2][3])*2; ggcd=gcd(w[1][1],w[1][2]);
         w[1][1]/=ggcd; w[1][2]/=ggcd;
         b[1][1]=c[1]*2+c[2],b[2][1]=c[1]*2+c[2];
         b[1][2]=c[3]*2+c[2],b[2][2]=c[3]*2+c[2]; ggcd=gcd(b[1][1],b[1][2]);
         b[1][1]/=ggcd; b[1][2]/=ggcd;

    }
    int sum=0;
    for (int i=1;i<=3;i++)
      for (int j=1;j<=7;j++)  sum+=ans[i][j];
    printf("请输入所求基因型:"); scanf("%s",qu); printf("\n");
    if (qu[0]==‘M‘ && qu[1]==‘M‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘X‘ && qu[8]==‘A‘)
      printf("所占比例:%d/%d",ans[1][1]/(gcd(ans[1][1],sum)),sum/(gcd(ans[1][1],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘M‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘X‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[1][2]/(gcd(ans[1][2],sum)),sum/(gcd(ans[1][2],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘M‘ && qu[2]==‘X‘ && qu[4]==‘a‘ && qu[6]==‘X‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[1][3]/(gcd(ans[1][3],sum)),sum/(gcd(ans[1][3],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘M‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘Y‘ && qu[8]==‘A‘)
      printf("所占比例:%d/%d",ans[1][4]/(gcd(ans[1][4],sum)),sum/(gcd(ans[1][4],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘M‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘Y‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[1][5]/(gcd(ans[1][5],sum)),sum/(gcd(ans[1][5],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘M‘ && qu[2]==‘X‘ && qu[4]==‘a‘ && qu[6]==‘Y‘ && qu[8]==‘A‘)
      printf("所占比例:%d/%d",ans[1][6]/(gcd(ans[1][6],sum)),sum/(gcd(ans[1][6],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘M‘ && qu[2]==‘X‘ && qu[4]==‘a‘ && qu[6]==‘Y‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[1][7]/(gcd(ans[1][7],sum)),sum/(gcd(ans[1][7],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘X‘ && qu[8]==‘A‘)
      printf("所占比例:%d/%d",ans[2][1]/(gcd(ans[2][1],sum)),sum/(gcd(ans[2][1],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘X‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[2][2]/(gcd(ans[2][2],sum)),sum/(gcd(ans[2][2],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘a‘ && qu[6]==‘X‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[2][3]/(gcd(ans[2][3],sum)),sum/(gcd(ans[2][3],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘Y‘ && qu[8]==‘A‘)
      printf("所占比例:%d/%d",ans[2][4]/(gcd(ans[2][4],sum)),sum/(gcd(ans[2][4],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘Y‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[2][5]/(gcd(ans[2][5],sum)),sum/(gcd(ans[2][5],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘a‘ && qu[6]==‘Y‘ && qu[8]==‘A‘)
      printf("所占比例:%d/%d",ans[2][6]/(gcd(ans[2][6],sum)),sum/(gcd(ans[2][6],sum)));

    if (qu[0]==‘M‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘a‘ && qu[6]==‘Y‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[2][7]/(gcd(ans[2][7],sum)),sum/(gcd(ans[2][7],sum)));

    if (qu[0]==‘m‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘X‘ && qu[8]==‘A‘)
      printf("所占比例:%d/%d",ans[3][1]/(gcd(ans[3][1],sum)),sum/(gcd(ans[3][1],sum)));

    if (qu[0]==‘m‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘X‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[3][2]/(gcd(ans[3][2],sum)),sum/(gcd(ans[3][2],sum)));

    if (qu[0]==‘m‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘a‘ && qu[6]==‘X‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[3][3]/(gcd(ans[3][3],sum)),sum/(gcd(ans[3][3],sum)));

    if (qu[0]==‘m‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘Y‘ && qu[8]==‘A‘)
      printf("所占比例:%d/%d",ans[3][4]/(gcd(ans[3][4],sum)),sum/(gcd(ans[3][4],sum)));

    if (qu[0]==‘m‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘A‘ && qu[6]==‘Y‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[3][5]/(gcd(ans[3][5],sum)),sum/(gcd(ans[3][5],sum)));

    if (qu[0]==‘m‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘a‘ && qu[6]==‘Y‘ && qu[8]==‘A‘)
      printf("所占比例:%d/%d",ans[3][6]/(gcd(ans[3][6],sum)),sum/(gcd(ans[3][6],sum)));

    if (qu[0]==‘m‘ && qu[1]==‘m‘ && qu[2]==‘X‘ && qu[4]==‘a‘ && qu[6]==‘Y‘ && qu[8]==‘a‘)
      printf("所占比例:%d/%d",ans[3][7]/(gcd(ans[3][7],sum)),sum/(gcd(ans[3][7],sum)));
     return 0;
}

原文地址:https://www.cnblogs.com/zylAK/p/10506633.html

时间: 2024-10-10 16:27:27

模拟棋盘法计算遗传中概率的相关文章

概率法计算PI

#include <iostream> using namespace std; //概率计算PI int main() { int inside=0; double val; int i; for ( i=0; i<100000000; i++) { double x = (double)(rand())/RAND_MAX; double y = (double)(rand())/RAND_MAX; if ( (x*x + y*y) <= 1.0 ) { inside++; }

在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件

在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件 引言 这两天沉迷了Google SketchUp,刚刚玩够,一时兴起,研究了一下WebBrowser. 我在<WebBrowser控件使用技巧分享>一文中曾谈到过"我现在可以通过WebBrowser实现对各种Html元素的操控,唯独无法控制Html的上传控件",出于安全原因,IE没有对上传控件提供操控支持,这使得我们没法像控制其他控件一样用简单的代码进行赋值. 比较实际的解决方案就是模拟操作了,下面我就将演示

【九天教您南方cass 9.1】 13 等高线法计算土方量

同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 我们讲课的教程附件也是共享的,请注意索取 在测量空间中. 九天老师的联系方式  点击直接请教九天老师吧! 土方量计算在土方工程中有着重要意义和作用,是工程设计的一个重要组成部分.土方量是竖向规划或调整的一个重要依据,也直接关系到工程造价,所以在计算土方时一定要实事求是.精益求精.符合实际.土方计算是土方测量内业处理中的一个关键环节,常用的方法有DTM法.断面法.方格网法.等高线法,它们各具特色,有着不同

计算理论中的莱斯定理(Rice&#39;s Theorem)——证明与应用

我们给出一个在探讨不可判定性时非常有用的结论--莱斯定理(Rice's Theorem).首先,我们来看前面讨论过的几个不可判定的例子: 这些都是由图灵机识别之语言的性质.而莱斯定理告诉我们,任何由图灵机识别之语言的非平凡性质(nontrivial property)都是不可判定的. 最后通过几个例子来探讨一下莱斯定理的应用.来看看下面这个语言能否使用莱斯定理来确定其可判定性. {<M> | M是一个TM,且L(M)可由一些拥有偶数个状态的图灵机识别} 首先来确定这是否是一个语言属性,显然是的

iOS7中计算UILabel中字符串的高度

iOS7中出现了新的方法计算UILabel中根据给定的Font以及str计算UILabel的frameSize的方法.本人提供category如下: UILabel+StringFrame.h ////  UILabel+StringFrame.h//  LabelHeight////  Copyright (c) 2014年 Y.X. All rights reserved.//#import <UIKit/UIKit.h>@interface UILabel (StringFrame)- 

使用Linq求和方法Sum计算集合中多个元素和时应该注意的性能问题

提出问题 本文使用下面的实例来说明问题,以下是实例的完整代码. //************************************************************ // // Sum应用示例代码 // // Author:三五月儿 // // Date:2014/09/10 // // http://blog.csdn.net/yl2isoft // //**********************************************************

计算DXFReader中多边形的面积代码示例

在DXFReader中, 一般的多边形的面积计算绝对值 其中K表是顶点的数目,它们的坐标,用于在求和和, 所以用下面的代码就可以计算出一个封闭的多段线的区域: view source print? 01 Dim Vertex As Object 02 Dim Entity As Object 03 Dim k As Long 04 Dim i As Long 05 Dim Area As Single 06 07 With DXFReader1 08 09  For Each Entity In

计算子网掩码中存在的主机数

一个局域网中某台主机的ip地址为176.68.160.12,使用22位作为网络 ,那么该局域网的子网掩码为____,最多可以连接的主机数为____.该局域网的子网掩码是255.255.252.0最多可以连接的主机数量为1022台计算子网掩码的过程是:子网掩码是由连续的"1"和连续的"0"构成,所以既然网络位是22位,而子网掩码一共是有32位组成,说明前22位都是1,后10位都是0 因此用2进制表示就是11111111 11111111 11111100 000000

计算直方图中最大矩形面积

题目是计算直方图中的最大矩形面积,下面是我的做法,我在网上也看到有人说可以通过栈的方式来解决,因为时间问题,并没有马上尝试,下回有时间在尝试下吧!! 还有这题有变式:计算矩阵中最大的矩形面积,其中矩阵中元素只能为1和0,代码下次补发吧!! 代码如下: #include<iostream>using namespace std; int maxSquare(const int pos,const int n,const int height[]){ if(n==1) return height[