c新手吧 关注:8,591贴子:48,091
  • 3回复贴,共1

一个关于数组的数模求解实例,新手搞了N天才搞定,分享一下!

只看楼主收藏回复



题如上图,书上代码无法得出正确结果,没办法,只能自己重写代码,把代码发上来给大家瞅瞅,看看还能修改简化吗?


数模求解实例.c
大小:2.90KB下载:0次转存:0次
文件已失效
IP属地:安徽1楼2016-06-16 10:31回复
    # include<stdio.h>
    # include<math.h>
    # define N 12
    int main(void)
    {
    float a[3][N] = {{0},{0},{0.50,1.41,3.00,3.37,3.40,4.72,4.72,5.43,7.57,8.38,8.98,9.50}};
    float b[3][N] = {{0},{0},{2.00,3.50,1.50,3.49,5.50,2.00,6.24,4.10,2.01,4.50,3.41,0.80}};
    float t;
    int i,j,k,l,m,n,an=0,bn=0,maxnum=0;
    int a_idx[N][N]={0},b_idx[N][N]={0};
    int anum[N]={0},bnum[N]={0},max[N]={0},tmp[N]={0};
    //步骤1:初始化坐标数组,并处理坐标值
    for(i=0; i<N; i++)
    {
    a[0][i] = i+1;
    t = a[2][i]-(int)a[2][i];
    if(t > 0.5)
    t -= 1;
    a[1][i] = t;
    b[0][i] = i+1;
    t = b[2][i]-(int)b[2][i];
    if(t > 0.5)
    t -= 1;
    b[1][i] = t;
    }
    //步骤2:排序
    for(i=0; i<N; i++)
    {
    for(j=0; j<N-1-i; j++)
    {
    if(a[1][j] > a[1][j+1])
    for(l=0; l<3; l++)
    t=a[l][j], a[l][j]=a[l][j+1], a[l][j+1]=t;
    if(b[1][j] > b[1][j+1])
    for(l=0; l<3; l++)
    t=b[l][j], b[l][j]=b[l][j+1], b[l][j+1]=t;
    }
    }
    //步骤3:分子组
    for(i=0,k=0; i<N; i++,k++)
    {
    t = a[1][i]+0.1;
    for(j=i,l=0; j<N&&a[1][j]<=t; j++,l++)
    {
    a_idx[k][l] = a[0][j];
    anum[k] = l;
    }
    a_idx[k][l] = 0;
    an = k;
    if(k!=0 && a_idx[k][anum[k]]==a_idx[k-1][anum[k-1]])
    {
    for(n=0; n<N; n++)
    a_idx[k][n] = 0;
    k -= 1;
    }
    }
    for(i=0,k=0; i<N&&k<N; i++,k++)
    {
    t = b[1][i]+0.1;
    for(j=i,l=0; j<N&&b[1][j]<=t; j++,l++)
    {
    b_idx[k][l] = b[0][j];
    bnum[k] = l;
    }
    b_idx[k][l] = 0;
    bn = k;
    if(k!=0 && b_idx[k][bnum[k]]==b_idx[k-1][bnum[k-1]])
    {
    for(n=0; n<N; n++)
    b_idx[k][n] = 0;
    k -= 1;
    }
    }
    //步骤4:求交集
    for(i=0; i<an; i++)
    for(k=0; k<bn; k++)
    {
    n=0;
    for(j=0; j<=anum[i]; j++)
    {
    for(l=0; l<=bnum[k]; l++)
    {
    if(a_idx[i][j] == b_idx[k][l])
    {
    tmp[n]=a_idx[i][j];
    n++;
    break;
    }
    }
    }
    if(n>=maxnum)
    {
    maxnum=n;
    for(m=0; m<maxnum; m++)
    max[m]=tmp[m];
    }
    }
    //步骤5:输出
    //输出二维数组a,b
    printf("\nA:\n");
    for(i=0; i<3; i++)
    {
    for(j=0; j<N; j++)
    if(i==0)
    printf("%6.0f",a[i][j]);
    else
    printf("%6.2f",a[i][j]);
    printf("\n");
    }
    printf("\nB:\n");
    for(i=0; i<3; i++)
    {
    for(j=0; j<N; j++)
    if(i==0)
    printf("%6.0f",b[i][j]);
    else
    printf("%6.2f",b[i][j]);
    printf("\n");
    }
    //输出子组
    printf("\nAi:\n");
    for(i=0; i<an; i++)
    {
    for(j=0; j<=anum[i]; j++)
    printf("%6d", a_idx[i][j]);
    printf("\n");
    }
    printf("\nBj:\n");
    for(i=0; i<bn; i++)
    {
    for(j=0; j<=bnum[i]; j++)
    printf("%6d", b_idx[i][j]);
    printf("\n");
    }
    //输出最大交集及其对应坐标
    printf("\nAi∩Bj:\n");
    for(i=0; i<maxnum; i++)
    printf("%8d\t", max[i]);
    printf("\n");
    for(i=0; i<maxnum; i++)
    {
    for(j=0; j<N; j++)
    {
    if(abs(a[0][j]-max[i]) < 1e-3)
    printf("(%.2f,", a[1][j]);
    if(abs(b[0][j]-max[i]) < 1e-3)
    printf("%.2f)\t", b[1][j]);
    }
    }
    printf("\n");
    return 0;
    }


    IP属地:安徽2楼2016-06-16 10:35
    回复
      # include<stdio.h>
      # define N 12
      float t;
      int i,j,k,l,m,n;
      int main(void)
      {
      void zbcl (float ab[3][N]);
      void sort (float ab[3][N]);
      void fz (float ab[3][N], int ab_idx[N][N], int abnum[], int * abn);
      void print_ab(float ab[3][N]);
      void print_ab_idx(int ab_idx[][N], int * abn, int abnum[]);
      void print_max_zb(float ab[][N], int max[],int * maxnum);
      float a[3][N] = {{0},{0},{0.50,1.41,3.00,3.37,3.40,4.72,4.72,5.43,7.57,8.38,8.98,9.50}};
      float b[3][N] = {{0},{0},{2.00,3.50,1.50,3.49,5.50,2.00,6.24,4.10,2.01,4.50,3.41,0.80}};
      int an=0,bn=0,maxnum=0;
      int a_idx[N][N]={0},b_idx[N][N]={0};
      int anum[N]={0},bnum[N]={0},max[N]={0},tmp[N]={0};
      //步骤1:初始化坐标数组,并处理坐标值
      zbcl(a);
      zbcl(b);
      //步骤2:排序
      sort (a);
      sort (b);
      //步骤3:分子组
      fz (a, a_idx, anum, &an);
      fz (b, b_idx, bnum, &bn);
      //步骤4:求交集
      for(i=0; i<an; i++)
      for(k=0; k<bn; k++)
      {
      n=0;
      for(j=0; j<=anum[i]; j++)
      {
      for(l=0; l<=bnum[k]; l++)
      {
      if(a_idx[i][j] == b_idx[k][l])
      {
      tmp[n]=a_idx[i][j];
      n++;
      break;
      }
      }
      }
      if(n>=maxnum)
      {
      maxnum=n;
      for(m=0; m<maxnum; m++)
      max[m]=tmp[m];
      }
      }
      //步骤5:输出
      //输出二维数组a,b
      printf("\nA:\n");
      print_ab(a);
      printf("\nB:\n");
      print_ab(b);
      //输出子组
      printf("\nAi:\n");
      print_ab_idx(a_idx, &an, anum);
      printf("\nBj:\n");
      print_ab_idx(b_idx, &bn, bnum);
      //输出最大交集及其对应坐标
      printf("\nAi∩Bj:\n");
      for(i=0; i<maxnum; i++)
      printf("%d\t", max[i]);
      printf("\n");
      print_max_zb(a, max, &maxnum);
      printf("\n");
      print_max_zb(b, max, &maxnum);
      return 0;
      }
      void zbcl (float ab[3][N])
      {
      for(i=0; i<N; i++)
      {
      ab[0][i] = i+1;
      t = ab[2][i]-(int)ab[2][i];
      if(t > 0.5)
      t -= 1;
      ab[1][i] = t;
      }
      }
      void sort (float ab[3][N])
      {
      for(i=0; i<N; i++)
      {
      for(j=0; j<N-1-i; j++)
      {
      if(ab[1][j] > ab[1][j+1])
      for(l=0; l<3; l++)
      t=ab[l][j], ab[l][j]=ab[l][j+1], ab[l][j+1]=t;
      }
      }
      }
      void fz (float ab[3][N], int ab_idx[N][N], int abnum[], int * abn)
      {
      for(i=0,k=0; i<N; i++,k++)
      {
      t = ab[1][i]+0.1;
      for(j=i,l=0; j<N&&ab[1][j]<=t; j++,l++)
      {
      ab_idx[k][l] = ab[0][j];
      abnum[k] = l;
      }
      ab_idx[k][l] = 0;
      *abn = k;
      if(k!=0 && ab_idx[k][abnum[k]]==ab_idx[k-1][abnum[k-1]])
      {
      for(n=0


      IP属地:安徽来自Android客户端3楼2016-06-20 01:47
      回复
        for(n=0; n<N; n++)
        ab_idx[k][n] = 0;
        k -= 1;
        }
        }
        }
        void print_ab(float ab[3][N])
        {
        for(i=0; i<3; i++)
        {
        for(j=0; j<N; j++)
        if(i==0)
        printf("%6.0f",ab[i][j]);
        else
        printf("%6.2f",ab[i][j]);
        printf("\n");
        }
        }
        void print_ab_idx(int ab_idx[][N], int * abn, int abnum[])
        {
        for(i=0; i<*abn; i++)
        {
        for(j=0; j<=abnum[i]; j++)
        printf("%6d", ab_idx[i][j]);
        printf("\n");
        }
        }
        void print_max_zb(float ab[][N], int max[],int * maxnum)
        {
        float abs (float x,float y);
        for(i=0; i<*maxnum; i++)
        {
        for(j=0; j<N; j++)
        {
        if(abs(ab[0][j],max[i]) < 1e-3)
        printf("%.2f\t", ab[1][j]);
        }
        }
        }
        float abs (float x,float y)
        {
        if (x-y<0)
        return y-x;
        else
        return x-y;
        }


        IP属地:安徽来自Android客户端4楼2016-06-20 01:50
        回复