回 帖 发 新 帖 刷新版面

主题:整形溢出处理

此函数为两种矩阵连乘的比较100个矩阵连乘的相乘次数,问题出在tranditional函数,tranditional函数中为传统矩阵连乘方法,需要处理溢出,但运行到一半时强行退出了,望高手指教!


#include <iostream>
using namespace std;

#include <time.h>
const int NUM=100;

time_t start,end,begin,last;

typedef struct matrix
{
  int row;
  int col;
} matrix;

typedef struct mincost
{
  int cost;
  int mid;
} mincost;

mincost** func(matrix* mt)
{
   mincost **rows;
   rows = new mincost*[NUM];
  for(int i=0;i<NUM;i++)
     rows[i] =new mincost[NUM-i];

  for(i=0;i<NUM;i++)
  {
     rows[i][0].cost=0;
     rows[i][0].mid=-1;
  }

  for(int step=1;step<NUM;step++)
    for(int j=0;j<NUM-step;j++)
    {
      int min=mt[j].row*mt[j].col*mt[j+step].col
        +rows[j][0].cost+rows[j+1][step-1].cost;
       int mid=j;
      for(i=1;i<step;i++)
      {
         int temp=rows[j][i].cost+rows[j+i+1][step-i-1].cost
        +mt[j].row*mt[j+i].col*mt[j+step].col;
        if(min>temp)
        {
          min=temp;
           mid=j+i;
        }
      }
       rows[j][step].cost=min;
       rows[j][step].mid=mid;
    }
    cout<<rows[0][NUM-1].cost<<" "<<rows[0][NUM-1].mid<<endl;
  return rows;
}


int rel(mincost **mc)
{
  for(int i=0;i<NUM;i++)
    delete[] mc[i];
    delete[] mc;
  return 0;
}

void tranditional(matrix* a)  //传统方法计算矩阵连乘相乘次数
{
    int at[100],bt[100];
    int p=0,q=0;
    for(int i=0;i<100;i++)
    {
        at[i]=0;
    }
    for(int b=0;b<NUM-1;b++)
    {
        int t=a[0].row*a[b].col*a[b+1].col; //计算两矩阵相乘次数
        for(i=0;i<100;i++)
            bt[i]=0;
        while(t)  //把各位数放进数组中
        {
            bt[p]=t%10;
            p++;
            t=(int)(t/10);
        }
        if(p>q)  //计算该整数长度
           q=p;
        for(int s=0;s<p;s++)
        {
            at[s]+=bt[s];
            int m=s;
            while(at[m]>=10)  //处理进位
            {
                at[m]=(at[m]+bt[m])%10;
                at[m+1]+=1;
                m+=1;
            }
        }

    }
    for(i=q;i>=0;i--)
        cout<<at[q];
    cout<<endl;
}

int main()
{
    matrix ma[NUM];
    srand((int)time(0));
    ma[0].row=1+(int)(rand()%100);
    ma[0].col=1+(int)(rand()%100);
    for(int i=1;i<NUM;i++)
    {
        ma[i].row=ma[i-1].col;
        ma[i].col=1+(int)(rand()%100);
    }
   time(& start);
   mincost **temp=func(ma);
   rel(temp);
   time(& end);
   double d,b;
   d=difftime(end,start);
   cout<<"time:"<<d<<endl;
   time(& begin);
   tranditional(ma);
   time(& last);
   b=difftime(last,begin);
   cout<<"time:"<<b<<endl;
   return 1;
}

回复列表 (共1个回复)

沙发

开调试运行吧。一般中途退出的最常见原因就是段异常,也就是指针访问超界,跟一下指针的运动轨迹吧

我来回复

您尚未登录,请登录后再回复。点此登录或注册