CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

100分求解程序错误

楼主et007123(程序人生)2005-10-18 17:32:17 在 C/C++ / C++ 语言 提问

下面这个程序是关于矩阵连乘问题的,运行没有什么问题,可是程序执行结果不对,我找了半天错误也不知道错在哪里了,希望哪位大虾帮帮忙,看看错在哪里了,把正确的程序发出来,谢谢了.  
   
  描述:给定n   个矩阵{A1,   A2,...,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。  
            考察这n个矩阵的连乘积A1A2...An。矩阵A   和B   可乘的条件是矩阵A的列数  
            等于矩阵B   的行数。若A   是一个p   x   q矩阵,B是一个q   *   r矩阵,则其乘积C=AB  
            是一个p   *   r矩阵,需要pqr次数乘。  
                   
              矩阵连乘积的最优计算次序问题,即对于给定的相继n   个矩阵{A1,A2,...,An}  
              (其中矩阵Ai的维数为   pi-1   *   pi,i=1,2,…,n),确定计算矩阵连乘积  
              A1A2...An   的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。  
   
      编程任务:对于给定的相继n个矩阵{A1,   A2,   ...,   An   }及其维数,编程计算矩阵连  
                          乘积A1A2...An   需要的最少数乘次数。  
      数据输入:由文件input.txt   给出输入数据。第1   行是给定的正整数n,表示有n   个矩阵  
                          连乘。第2行是n+1个正整数P0   ,   P1,   ...,   Pn   ,表示矩阵Ai   的维数  
                    为pi-1   *   pi   ,i=1,2,…,n。  
      结果输出:将计算出的最少数乘次数输出到文件output.txt。  
  #include   <iostream.h>    
  #include   <fstream.h>  
  #include   <stdio.h>    
   
   
  //---------------------   变量、函数定义   开始   ------------------  
   
  ofstream   myoutf("output.txt");                         //输出到文件,全局变量  
   
   
  /*-----------------   MatrixChain函数定义   ----------------------  
    *     函   数   名:   MatrixChain                                                                         *  
    *     返回类型:   void   无返回值                                                                     *  
    *     参数说明:   p[]   矩阵的维数                                                                   *  
    *                         n       矩阵连乘的个数                                                           *  
    *           m       保存矩阵最少连乘个数的二维数组                           *  
    *     功         能:   输出   n个矩阵连乘的最优值                                               *  
    *     调用示例:   MatrixChain(p,n,m);                                                         *  
    *-----------------------------------------------------------*/  
   
  void   MatrixChain(int   *   p,int   n,int   *   *   m)  
  {  
      for   (int   i   =1;   i   <=   n;   i++)   m[i][i]   =   0;//当i=j时,m[i][j]=0  
      for   (int   r   =2;   r   <=   n;   r++)  
    for   (int   i   =1;   i   <=   n-r+1;   i++)  
    {  
        int   j   =   i   +   r   -1;  
        //   因为不知道k的位置,所以m[i][j]递归的看作  
        //   m[i][i]   +   m[i+1][j]   +   p[i-1]   *   p[i]   *   p[j];  
        //   然后通过下面的循环,找到k的位置  
        m[i][j]   =   m[i+1][j]   +   p[i-1]   *   p[i]   *   p[j];  
        //s[i][j]   =   i;  
               
        //假设在k位置断开,然后计算最少乘数,  
        for   (int   k   =   i+1;   k   <   j;   k++)  
        {  
            int   t   =   m[i][k]   +   m[k+1][j]   +   p[i-1]   *   p[k]   *   p[j];  
       
      //==========判断最小的乘数,保存到数组里============  
      if   (t   <   m[i][j])  
      {  
          m[i][j]   =   t;  
         
          //s[i][j]   =   k;  
      }//if    
                  //=================================================  
        }//for   k  
     
    }//for   i  
   
          myoutf   <<   m[1][n]   <<   endl;                         //输出结果到文件  
   
  }//void   MatrixChain  
   
     
   
  //---------------------   变量、函数定义   结束   ------------------  
   
     
   
  //---------------------   主函数   开始   --------------------------  
  void   main()  
  {  
      int   MatrixNum;                                                             //定义连乘的矩阵数  
      int   i   ,   j;  
      int   *   p;  
      int   *   *   m;                                                                     //保存最优值数组  
   
      ifstream   myinf("input.txt",ios::nocreate);     //读取文件  
      if   (myinf.fail())  
      {  
        cerr   <<   "读入文件时,出错!";  
        return;                                                                       //如果没有输入文件,则返回错误  
        }//if   (myinf.fail())    
       
      myinf   >>   MatrixNum;                                                   //读取矩阵个数  
      cout   <<   MatrixNum   <<   endl;  
       
      if   (MatrixNum   <=   0)  
      {  
          cerr   <<   "矩阵连乘个数不合法,出错!";  
        return;                                               //如果没有输入文件,则返回错误  
      }//   if   (MatrixNum   >   0)  
       
      p   =   new   int[MatrixNum   +   1];           //分配矩阵维数数组空间  
      if   (p   ==   NULL)  
      {  
          cerr   <<   "数组空间分配不成功,出错!";  
    return;  
      }//   if   (p   !=   NULL)    
     
      for   (i   =   0;i   <   MatrixNum   +1   ;   i++)//读入矩阵维数  
    {  
              myinf   >>   p[i];  
        cout   <<   p[i]   <<   "   ";  
    }//for   i   <=   MatrixNum  
      cout   <<   endl;  
   
      //-----------   定义二维动态数组   开始   --------------  
       
      m   =   new   int   *   [MatrixNum   +   1];             //给一维数组动态分配内存  
      for   (i=0   ;   i   <   MatrixNum   +1;   i++)  
      {    
    m[i]   =   new   int[MatrixNum   +1];  
      }//for   分配二维数组空间  
   
      for   (i=0   ;   i   <   MatrixNum   +   1;i++)       //给数组初始化  
          for   (j   =   0;   j   <   MatrixNum   +1;j++)  
    {  
              m[i][j]   =   0;  
    }//for    
      //-----------   定义二维动态数组   结束   --------------  
           
      MatrixChain(p,MatrixNum,   m);               //调用动态规划矩阵连乘算法  
   
      //--------释放数组---------  
      for(i=0;i   <   MatrixNum   +1   ;   i++)   delete[]   m[i];  
   
      delete[]   m;                                                 //释放二维数组空间  
       
      delete[]   p;                                                 //释放矩阵维数数组空间  
      myinf.close();                                           //关闭输入文件  
      myoutf.close();                                         //关闭输出文件  
  }//void   main()  
   
  //---------------------   主函数   结束   --------------------------          
   
  问题点数:100、回复次数:12Top

1 楼et007123(程序人生)回复于 2005-10-18 17:38:32 得分 0

比如在   input.txt   中输入  
  3  
  10,100,5,50  
  的输出结果应为7500.Top

2 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2005-10-18 17:46:08 得分 0

我顶一下     上玩课在回来侃侃!Top

3 楼n6002(犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇犇)回复于 2005-10-18 18:32:33 得分 40

input.txt  
  3  
  10   100   5   50  
   
  output.txt  
  7500Top

4 楼K()回复于 2005-10-18 18:57:55 得分 0

gzTop

5 楼nanhaochen()回复于 2005-10-22 21:40:32 得分 0

upTop

6 楼v41dugu(一步一生)回复于 2005-10-22 23:31:47 得分 0

长了~~难得看Top

7 楼k9k6k3(我从不玩命)回复于 2005-10-23 04:49:24 得分 0

up  
  Top

8 楼csucdl(csucdl)回复于 2005-10-23 07:59:40 得分 40

input.txt  
  3  
  10   100   5   50  
   
  注意不要加逗号  
   
  output.txt  
  7500Top

9 楼cxyol(C++,VC 学习中......)回复于 2005-10-23 10:33:41 得分 0

mark  
  Top

10 楼karlfly(flykarl)回复于 2005-10-23 20:46:26 得分 0

也太长了啊Top

11 楼oosky2004(我要好东西)回复于 2005-10-24 09:22:17 得分 0

Mark  
  Top

12 楼csucdl(csucdl)回复于 2005-10-24 09:28:10 得分 20

算法很好啊,动态规划  
  Top

相关问题

  • 100分求解程序错误。telnet相关。内附源码。
  • 800a000d错误,求解!
  • 求解CS1501错误?
  • 求解小程序...
  • c++的程序在main函数的return后出现应用程序错误,求解
  • 80040e10错误,求解答!
  • LNK2001错误(500分求解)
  • 编译错误求解!急
  • ASSERT 错误,请求解答
  • mssql_querry()错误,求解决?

关键词

  • 矩阵
  • ai
  • 文件
  • 连乘
  • 乘积
  • matrixchain
  • 维数
  • 给定
  • 计算
  • 程序

得分解答快速导航

  • 帖主:et007123
  • n6002
  • csucdl
  • csucdl

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo