Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Hàm nhanMatran bị lỗi tràn số thì sửa thế nào?

  1. #1
    Ngày gia nhập
    08 2011
    Bài viết
    1

    Mặc định Hàm nhanMatran bị lỗi tràn số thì sửa thế nào?

    Thế này các bác ạ, thầy em bảo viết chương trình tính tổng và tích 2 ma trận bằng C++, tổng thì em đã hoàn thành rồi, còn tích thì em không hiểu sao luôn bị tràn số:sosad:
    em đọc code hàm NhanMaTran của em mà không biết tại sao lại bị, ko rõ thuật toán có vấn đề gì :surrender: Mong các cao nhân chỉ giúp em lỗi sai ạ, các bác chỉ cần xét hàm NhanMatran thoi :beauty:

    \\ À chương trình này thầy em bắt dùng con trỏ, nói chung để dễ hiểu các bác có thể coi nó là dùng mảng 1 chiều để biểu diễn ma trận và tính tích bằng cái mảng 1 chiều đó

    Code:
    #include <iostream.h>
    #include <conio.h>
    void NhanMatran(int *A,int*B,int *C,int M,int N)
    {	
    	for(int I=0;I<=M*N;++I)
    	{
    		C[I]=A[I]*B[I];
    		int k = I/N;
    		
    		int l =(M*N-I)/N;
    		if(k==0) 
    		{
    			for (int l =(M*N-I)/N;l>=1;--l)
    			{
    				C[I]=C[I]+A[I]*B[I+l*N];
    				
    			}
    		}
    		else(k!=0)
    		{
    			for (int k = (I/N);k>=1;--k)			
    			{
    				C[I]=C[I]+A[I]*B[I-k*N];	
    			}
    						
    			for (int l =(M*N-I)/N;l>=1;--l)
    			{
    				C[I]=C[I]+A[I]*B[I+l*N];
    			}					
    		}		
    	}		
    }
    void AddMatrix(int *A,int *B,int*C,int M,int N)
    	 {
    		 for(int I=0;I<M*N;++I)
    		 C[I] = A[I] + B[I];
    	 }
    
    	 int AllocMatrix(int **A,int M,int N)
    	 {
    		 *A = new int [M*N];
    		 if (*A == NULL)
    		 return 0;
    		 return 1;
    	 }
    
    	 void FreeMatrix(int *A)
    	 {
    		 if (A!=NULL)
    		 delete [] A;
    	 }
    void InputMatrix(int *A,int M,int N,char Symbol)
    	 {
    		 for(int I=0;I<M;++I)
    		 for(int J=0;J<N;++J)
    		{
    			cout<<Symbol<<"["<<I<<"]["<<J<<"]=";
    			cin>>A[I*N+J];
    		}
    	}
    
    void DisplayMatrix(int *A,int M,int N)
    	 {
    		 for(int I=0;I<M;++I)
    		 {
    		       for(int J=0;J<N;++J)
    		       {
    		                
    				cout<<"    "<<A[I*N+J];
    			
    		        }
    		        cout<<endl;
    		 }
    	 }
    
    
    int main()
    {
    	int M,N;
    	 int *A = NULL,*B = NULL,*C = NULL;
    	 
    	 cout<<"Nhap so dong cua ma tran:";	 cin>>M;
    	 cout<<"Nhap so cot cua ma tran:"; 	 cin>>N;
     	
    	 if (!AllocMatrix(&A,M,N))
    	 {
    		 cout<<"Khong con du bo nho!"<<endl;
    		 return 1;
    	 }
    
    	 if (!AllocMatrix(&B,M,N))
    	 {
    		 cout<<"Khong con du bo nho!"<<endl;
    		 FreeMatrix(A);
    		 return 1;
    	 }
    	 if (!AllocMatrix(&C,M,N))
    	 {
    		 cout<<"Khong con du bo nho!"<<endl;
    		 FreeMatrix(A);
    		 FreeMatrix(B);
    		 return 1;
    	 }
    	 cout<<"Nhap ma tran thu 1"<<endl;
    	 InputMatrix(A,M,N,'A');
    	 cout<<"Nhap ma tran thu 2"<<endl;
    	 InputMatrix(B,M,N,'B');
    	 
    	 cout<<"Ma tran thu 1"<<endl;
    	 DisplayMatrix(A,M,N);
    	 cout<<"Ma tran thu 2"<<endl;
    	 DisplayMatrix(B,M,N);
    	 AddMatrix(A,B,C,M,N);
    	 cout<<"Tong hai ma tran"<<endl;
    	 DisplayMatrix(C,M,N);
    	 
    	 NhanMatran(A,B,C,M,N);
    	 cout<<"Tich hai ma tran"<<endl;
    	 DisplayMatrix(C,M,N);
    	 FreeMatrix(A);
    	 FreeMatrix(B);
    	 FreeMatrix(C);
    	 return 0;
    
    }

  2. #2
    Ngày gia nhập
    10 2007
    Bài viết
    12

    Nếu bạn lập trình trên Turbo C++ for DOS thì kiểu dữ liệu int có độ dài 16 bit tức là có độ lớn tối đa là 65535. Vì thế chỉ cần một phép nhân 256*256 thì cũng đã gây tràn số.

    Muốn sử dụng các số nguyên lớn, bạn cần tự tạo một kiểu dữ liệu riêng cho mình hoặc dùng big integer class có sẵn rất nhiều trên mạng.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn