Programming Algorithms

C++ مجموعه ای از الگوریتم ها و نمونه سوالات حل شده به زبان

Programming Algorithms

C++ مجموعه ای از الگوریتم ها و نمونه سوالات حل شده به زبان

Programming Algorithms

خوش آمدید

امیدوارم مطالب این وبلاگ برای شما کارآمد باشد.
لطفا اگر اشکالی وجود داشت من را در جریان بگذارید...

بایگانی
آخرین نظرات
#include <iostream> // cin, cout
#include <cstdio> // freopen
#include <cmath> // abs

#define repi( n) for( int i = 0; i < ( n); i++)
#define repj( n) for( int j = 0; j < ( n); j++)
#define Long long long int
#define up 0 // numerator
#define down 1 // denominator

using namespace std;

Long GCD( Long, Long);
void Get( Long***, int);
void Print( Long***, int);
void Change_To_Upper_Triangular( Long***, int);
void Change_To_Lower_Triangular( Long***, int);
void Gauss( Long***, int);

int main()
{
freopen( "input.txt", "r", stdin);
freopen( "output.txt", "w", stdout);
int size;
cin >> size;
Long*** mat = new Long** [size];
repi( size) mat[i] = new Long* [size + 1];
repi( size) repj( size + 1) mat[i][j] = new Long [2];
Get( mat, size);
cout << endl << "At first:" << endl << endl;
Print( mat, size);
cout << endl;
Gauss( mat, size);
cout << endl;
return 0;
}

Long GCD( Long a, Long b)
{
Long temp;
while(b)
{
temp = a;
a = b;
b = temp % b;
}
return a;
}

void Get( Long*** mat, int n)
{
cout << "The form of any numbers is: \"numerator / denominator\"" << endl;
cout << "*** If your number is integer, Enter '1' for 'down' variable. Even for '0'." << endl;
repi( n)
{
repj( n + 1)
{
cin >> mat[i][j][up]
>> mat[i][j][down];
}
}
}

void Print( Long*** mat, int size)
{
for( int i = 0; i < size; i++)
{
for( int j = 0; j < size + 1; j++)
{
cout << "( " << mat[i][j][up]
<< " / " << mat[i][j][down]
<< " )" << "\t";
}
cout << endl;
}
}

void Change_To_Upper_Triangular( Long*** mat, int size)
{
Long temp, up1, down1, up2, down2;
for( int j = 0; j < size - 1; j++)
{
for( int i = j + 1; i < size; i++)
{
up1 = mat[j][j][up];
down1 = mat[j][j][down];
up2 = mat[i][j][up];
down2 = mat[i][j][down];
if( mat[i][j][up])
{
for( int k = 0; k < size + 1; k++)
{
mat[i][k][up] = (-1) * mat[i][k][up] * up1 * down2 * mat[j][k][down]
+ mat[j][k][up] * up2 * down1 * mat[i][k][down];
mat[i][k][down] = mat[i][k][down] * up2 * down1 * mat[j][k][down];
if( !mat[i][k][up])
{
mat[i][k][down] = 1;
}
else
{
temp = GCD( mat[i][k][up], mat[i][k][down]);
mat[i][k][up] /= temp;
mat[i][k][down] /= temp;
}
}
}
}
}
}

void Change_To_Lower_Triangular( Long*** mat, int size)
{
Long temp, up1, down1, up2, down2;
for( int j = size - 1; j > 0; j--)
{
for( int i = j - 1; i >= 0; i--)
{
up1 = mat[j][j][up];
down1 = mat[j][j][down];
up2 = mat[i][j][up];
down2 = mat[i][j][down];
if( mat[i][j][up])
{
for( int k = 0; k < size + 1; k++)
{
mat[i][k][up] = (-1) * mat[i][k][up] * up1 * down2 * mat[j][k][down]
+ mat[j][k][up] * up2 * down1 * mat[i][k][down];
mat[i][k][down] = mat[i][k][down] * up2 * down1 * mat[j][k][down];
if( !mat[i][k][up])
{
mat[i][k][down] = 1;
}
else
{
temp = GCD( mat[i][k][up], mat[i][k][down]);
mat[i][k][up] /= temp;
mat[i][k][down] /= temp;
}
}
}
}
}
}

void Gauss( Long*** mat, int size)
{
Change_To_Upper_Triangular( mat, size);
cout << "After changing to upper triangular:" << endl << endl;
Print( mat, size);
cout << endl;
Change_To_Lower_Triangular( mat, size);
cout << "After changing to lower triangular:" << endl << endl;
Print( mat, size);
cout << endl;

Long temp;
Long** answer = new Long* [ size];
repi( size) answer[i] = new Long [2];
for( int i = 0; i < size; i++)
{
answer[i][up] = mat[i][size][up] * mat[i][i][down];
answer[i][down] = mat[i][size][down] * mat[i][i][up];
if( !answer[i][up])
{
answer[i][down] = 1;
}
else
{
temp = GCD( answer[i][up], answer[i][down]);
answer[i][up] /= temp;
answer[i][down] /= temp;
}
}
cout << "So, the answers are:" << endl << endl;
for( int i = 0; i < size; i++)
{
cout << "x[" << i + 1 << "] = "
<< answer[i][up] << " / " << answer[i][down] << endl;
}
}

input example: ( input.txt )


3

2 1 4 1 6 1 18 1
4 1 5 1 6 1 24 1
3 1 1 1 -2 1 4 1


output of input example: ( output.txt )


The form of any numbers is: "numerator / denominator"
*** If your number is integer, Enter '1' for 'denominator' variable. Even for '0'.

At first:

( 2 / 1 ) ( 4 / 1 ) ( 6 / 1 ) ( 18 / 1 )
( 4 / 1 ) ( 5 / 1 ) ( 6 / 1 ) ( 24 / 1 )
( 3 / 1 ) ( 1 / 1 ) ( -2 / 1 ) ( 4 / 1 )

After changing to upper triangular:

( 2 / 1 ) ( 4 / 1 ) ( 6 / 1 ) ( 18 / 1 )
( 0 / 1 ) ( 3 / 2 ) ( 3 / 1 ) ( 6 / 1 )
( 0 / 1 ) ( 0 / 1 ) ( -3 / 10 ) ( -9 / 10 )

After changing to lower triangular:

( -3 / 40 ) ( 0 / 1 ) ( 0 / 1 ) ( -3 / 10 )
( 0 / 1 ) ( 3 / 20 ) ( 0 / 1 ) ( -3 / 10 )
( 0 / 1 ) ( 0 / 1 ) ( -3 / 10 ) ( -9 / 10 )

So, the answers are:

x[1] = 4 / 1
x[2] = -2 / 1
x[3] = 3 / 1



  • Ali Maleki

نظرات  (۱)

دایرکتوری تبادل لینک جایی برای معرفی وبلاگ و وبسایت شما.

www.Linc.ir

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی