主题:整形溢出处理
此函数为两种矩阵连乘的比较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;
}
#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;
}