الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشروع رقم 1.

بدأه فهدالشلوي في 19 أغسطس 2008 · 42 رد · 6,927 مشاهدة · في مشاريع ومسابقات القسم
مشاركة: واتساب X فيسبوك تيليجرام
#26
اقتباس
وجدت أن استخدام List هو أفضل من vector

سوف اجرب اللست.

أخي djug البرنامج يفترض ان يتعامل مع اعداد كبيرة جدا مثلا 500 خانه مضروب في عدد مثلا من 1000خانه

لم اصل الى عمليه الضرب ولم افكر فيها الى الآن

وليس شرط ان نعاملها بنفس اسلوب تفكيرنا في الجمع لكن اذا وصلت سوف ابداء بانزال الفكره هنا اولا.

tvquran_6.gif

#27

أردت فقط توضيح أن هناك فكرة نربح معها الوقت مع عملية الضرب (يمكن استعمالها مع الجمع أيضا و مع غيرها من العمليات )

فكر بنفس أسلوب هذه الطريقة لتحل مشكل عملية الجمع

لا تنسى أنه يمكن أن نطبق هذه الطريقة بطريقة تراجعية

مثلا عدد من1000 خانة نقسمه إلى قسمين كل قسم بـ 500 خانة

ثم نقسم كل قسم إلى250خانة....و هكذا دواليك إللا أن نصل إلى SmallInteger...

أتمنى ان تكون فكرتي واضحة.. :)

مجرد فكرة

#28

بصراحة صار لي فترة طويلة عن المنتدى لكن احس اني صغير جدا امام مشاريعكم احاول قدر الامكان اني اطور مستواي واحب اللغة بشكل او باخر

انا مستمتع بطرحكم

تحياااااااااااتي11

يارب التأهل ياكريم

#29

انا من كتبت الموضوع يا فهد وانا ابحث ....

وانا والله مبتدى لكن لقيت طريقة تقسيم ال string الى اجزاء

في مكتبة ال string.h

توجد دالة strtok

بس حبيت اشارك معك ....وجاري البحث بالموضوع

#30

أخي djug فكرتك فيها مشكلات : عند تقسيم العدد الى أجزاء بهذه الطريقه لا تأمن عند الضرب خروج الناتج عن مجال العدد (أكبر عدد صحيح مثلا)

ثم عند تجميع العدد تحتاج الى ضربه في قوى العشرة قبل جمعه .

أخي الذ11بح بارك الله فيك الهدف من المشروع هدف تعليمي لذلك يتم طرح الأفكار والكودات هنا من أجل يستفيد الكل من ذلك.

ثم بعد ذلك العلم بالتعلم فقط قليل من تطبيق الكودات مع الكمبايلر تجد الموضوع سهل جدا.

أخي almstshar2 وفقك الله أشكر لك بحثك ومحاولتك المساعده وأجمل ما يميز لغه السي توفر طرق مختلفه ودوال كثيرة تحل المشكله.

تقسيم النص ليس مشكل في برنامجنا هناك طرق كثيرة لعمل ذلك .

tvquran_6.gif

#31

السلام عليكم ..

عملك رائع أخي فهد ... ومتقن ان شاء الله .

عملت أضافات صغيرة ,,

تشمل عوامل المقارنة ( أكبر من - أضغر من - المساواة ) .

وايضا حذف الاصفار التي على يسار العدد ( ليس لها فائدة ) .

bool BigInteger::operator > (const BigInteger& right)
	{
		if(nod.size() > right.nod.size())
			return true;
		if(nod.size() < right.nod.size())
			return false;

		vector<short int>::const_iterator R;
		vector<short int>::const_iterator L;
		for(L=nod.begin(),R=right.nod.begin();L!=nod.end(),R!=right.nod.end();L++,R++)
			{
				if(*L>*R)
					return true;
				if(*L<*R)
					return false;
			}


		return false; // == 

	}
	bool BigInteger::operator == (const BigInteger& right)
	{
		if(nod.size() != right.nod.size())
			return false;
		vector<short int>::const_iterator R;
		vector<short int>::const_iterator L;

		for(L=nod.begin(),R=right.nod.begin();L!=nod.end(),R!=right.nod.end();L++,R++)
			{
				if(*L!=*R)
					return false;
			}



		return true;

	}
	bool BigInteger::operator < (const BigInteger& right)
	{
		if(nod.size() < right.nod.size())
			return true;
		if(nod.size() > right.nod.size())
			return false;

		vector<short int>::const_iterator R;
		vector<short int>::const_iterator L;
		for(L=nod.begin(),R=right.nod.begin();L!=nod.end(),R!=right.nod.end();L++,R++)
			{
				if(*L<*R)
					return true;
				if(*L>*R)
					return false;
			}


		return false; // == 

	}

main.zip

تم تعديل هذه المشاركة بواسطة الشمري في 22 أغسطس 2008 في 18:01

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#32

جميل جدا وفقك الله سوف أعيد القراءة والتطبيق و أوفيك بالجديد.

tvquran_6.gif

#33

up ,

عملية الطرح ممكن هي اسهل ما بقي لنا ..

لا يوجد لدي فكرة الان لتسريع الخوارزمية .. عدا ما قاله الاخ djug ..

لكن الطرح ممكن حله بسهولة .. عن طريق ال vector أيضا .. نضيف اثنين iterator ... أحدهما يسير باتجاهين ( يستلف ويعود ) .. والاخ الثاني يبقى في مكانه ينتظر القيم المحضرة .....

سأحاول تطبيق ما قلت .. وتوضيح أكثر حولها ,,

هل لديكم رغبة بمزيد من المناقشة :D .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#34

أخي فهد

مرت ثلاث أيام على آخر مشاركة في الموضوع

و كأن الموضوع نائم

واصلوا عملكم فالمشروع جد مهم

بارك الله فيكم

#35

يبدو انني لن أستطيع الأكمال .

أنسحبت من المشروع .

المناخ والطقس مؤثر على قليلا.

ربما إذا تحسنت الأجواء سوف أعود له.

tvquran_6.gif

#36

السلام عليكم ورحمه الله وبركاته ،

أولا أحب أحي صاحب الموضوع أخ فهد على المجهود الأكثر من رائع هنا ، بالأضافه الى الأخ الشمري ,والأخ أحمد ...

ثانيا ، لدى أقتراح حول عمليه الجمع .. لما نقوم بجمع العددين بنفس الطريقه التي نجمع بها الأعداد بشكل يدوي .

في البدايه ، نقوم بتنزيل العدد الأول في مصفوفه ، والثاني أيضا .. (كل خانه في العدد تكون في خانه في المصفوفه )..

الأن الخوارزميه كالتالي :

اذا كان العدد الثاني = صفر ، اذا حاصل الجمع هو العدد الأول

اذا كان العدد الأول = صفر ، اذا حاصل الجمع هو العدد الثاني

اذا كان العدد الثاني = -العدد الأول ، نرجع صفر .. (نقوم بعمل داله نسميها neg تقوم بارجاع بعكس المتغير negative )

اذا كان العددين باشارات مختلفه فهي عمليه طرح .

اذا كان العددين بنفس الأشاره ، نقوم بجمع الخانه الأخيره في المصفوفه الأولى مع الخانه الأخيره في المصفوفه الثانيه مع المتغير carry (الذي يكون في البدايه = صفر) ، اذا كان حاصل الجمع أكبر من 9 ، نقوم بأخذ باقي قسمه حاصل الجمع على 10 ، ونجعل الحمل = 1 ، والا يكون الحمل = 0 .

الأن نضيف حاصل الجمع الى الخانه الأخيره في المصفوفه الثالثه .. الأن ننتقل الى خانه ما قبل الاخيره في الثلاث مصفوفات ، ونستمر هكذا الى أن نصل الى الخانه الأولى في أحد المصفوفتين ..

في حال كنا وصلنا للخانه الأولى (0) في المصفوفتين ، فنضيف الحمل مباشره الى الخانه الأولى في المصفوفه الثالثه.

في حال كنا وصلنا للخانه الأولى في المصفوفه الأولى ، نقوم بجمع ما تبقى من خانات في المصفوفه الثانيه مع الحمل ، ونكرر الخطوات أعلاه .. ونفس الكلام لو وصلنا للخانه الأولى في المصفوفه الثانيه ..

هذه Psudo-Code لعمليه الجمع فقط وليس لكامل الخوارزميه يمكن أن يفيد :

this  first Number
other  second Number
answer  answer

the name of array is digits 

int top1= length for first number  
int top2= length for second number  
int top3=max(top1,top2)+1;

top3--;
int carry=0; 
int sum=0;

while (top1>=0 && top2>=0) 
{
	sum=this.digits[top1]+other.digits[top2]+carry;
	if (sum>9)  {sum%=10; carry=1;} else carry=0;
	answer.digits[top3]=sum;
	top1--;top2--;top3--;
}


if (top1<0 && top2<0) 
{
	answer.digits[0]=carry;
} 
else if (top1<0)
{
	while (top2>=0) 
	{
		sum=other.digits[top2]+carry;
		if (sum>9) {sum%=10; carry=1;} else carry=0;
		answer.digits[top3]=sum;
		top2--;top3--;
	}
	answer.digits[top3]=carry;
}
else 
{
	while (top1>=0)
	{
		sum=this.digits[top1]+carry;
		if (sum>9) {sum%=10; carry=1;} else carry=0;
		answer.digits[top3]=sum;
		top1--;top3--;
	}
	answer.digits[top3]=carry;
}
	return answer;

ما رأيكم ؟

هل سيتوقف المشروع ياجماعه ؟ أم ماذا .........

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 30 أغسطس 2008 في 01:00

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#37

أهلا أخي وجدي ,

بالنسبة للخوارزمية التي ذكرتها ,, هي تقريبا المطبقة في المثال المطروح ,,

باستثناء أنك تريد تنفيذ كل العمليات في دالة واحدة ,, هذا ما فهمته .

بالنسبة لخوارزميتك أخي وجدي .. ان شاء الله انها تعمل ,, ولكن هناك طريقة وضعها الاخ فهد .. أعتقد انها اسهل ,

لو كان عندنا هذين العددين :

1234567

1234

فاننا قبل ان نجمعها .. نساوي الخانات بهذه الطريقة :

1234567

0001234

بالتالي سنستغني عن عمل أكثر من Loop ..

ما رأيك ؟

أنا أفضل أن نعمل دالة للجمع وأخرى للطرح ,, اذا كان العددين مختلفي الاشارة . . نستدعي دالة الطرح .. والا فاننا نجمع .

عملية الجمع الان تعمل بدون مشاكل ان شاء الله ,

لكن هل لديك طريقة سريعة لعملية الطرح ,, لانها تحتاج لاستلاف وذهاب الى اليسار وعودة مرة أخرى ,,, وهذا يستنزف وقت ...

أو اننا نعمل بطريقة يدوية .. كما تفضلت وقلت .

تم تعديل هذه المشاركة بواسطة الشمري في 30 أغسطس 2008 في 18:54

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#38

السلام عليكم ورحمة الله وبركاته

لقد أعجبتنى هذه الفكره كثيرا

وأحببت أن اشارك معكم

فهذه بدايتى مع الموضوع , الكلاس يحتوى على دوال مفيده جدا وكذلك الجمع والضرب والمقارنه وباقى ان شاء الله الطرح و القسمه

وانا لا احب لهذا الموضوع أن يترك

لأنه بجد موضوع جميل جدا


#include <string>
#include <vector>
#include <cstdlib>
using namespace std;
class BigInteger
{
private:
string s;
string num;
vector<int> v_num;
bool sign;
short int start;
public:
BigInteger();
BigInteger(const string);
void erase_left_z();
void print();
bool is_equal(BigInteger);
bool operator>(BigInteger);
bool operator<(BigInteger);
BigInteger operator+(BigInteger);
BigInteger mult_num(int);
BigInteger operator*(BigInteger);
BigInteger operator=(BigInteger);
BigInteger add_R_Zeros(int);
bool Is_Pos();



};
//****************************************************************************
BigInteger::BigInteger()
{
s="";
num="";
}
//////////////////////////////////////////////////////////////////////////
BigInteger::BigInteger(const string sa)
{
s=sa;
num="";
sign=Is_Pos();
erase_left_z();
for (int i=num.length()-1;i>=0;i--)
{
v_num.push_back(num-48);


}
}
/////////////////////////////////////////////////////////////////////////
bool BigInteger::Is_Pos()
{
if(s[0]=='+')
{
start=1;
return true;
}
else if(s[0]!='+' && s[0]!='-')
{
start=0;
return true;
}
else if (s[0]=='-')
{
start=1;
return false;
}
return false;

}
/////////////////////////////////////////////////////////////////////////////
void BigInteger::erase_left_z()
{
bool b=true;
int i=start;
int num_of_left_z=0;
while(b)
{
if(s=='0')
num_of_left_z++;
else if(s!='0') b=false;
i++;
}
for (i=num_of_left_z+start;i<s.length();i++)
{
num+=s;
}
if(num=="") num="0";
}
///////////////////////////////////////////////////////////////////////////
void BigInteger::print()
{
cout<<(sign?'+':'-');
cout<<num<<endl;
}
///////////////////////////////////////////////////////////////////////////
bool BigInteger::is_equal(BigInteger b)
{
if(sign==b.sign)
{

int n=0;
if(num.length()!=b.num.length()) return false;
else
{
for (int i=0;i<num.length();i++)
{
if(num!=b.num) return false;
}

}
return true;
}
return false;
}
/////////////////////////////////////////////////////////////////////////
bool BigInteger::operator>(BigInteger b)
{
if(sign && b.sign)
{
if(num.length()>b.num.length()) return true;
else if(num.length()<b.num.length()) return false;
else
{
for (int i=0;i<num.length();i++)
{
if(num>b.num) {return true;break;}
}

}
return false;
}
else if(sign && b.sign==false) return true;
else if(sign==false && b.sign) return false;
else
{
if(num.length()>b.num.length()) return false;
else if(num.length()<b.num.length()) return true;
else
{
for (int i=0;i<num.length();i++)
{
if(num<b.num) return true;
}

}
return false;
}
return false;
}
//////////////////////////////////////////////////////////////////////////////
bool BigInteger::operator<(BigInteger b)
{
return (b>*this);
}
////////////////////////////////////////////////////////////////////////////////
BigInteger BigInteger::operator+(BigInteger b)
{
BigInteger Error("0");
if(sign==b.sign)
{
int s1=num.length();
int s2=b.num.length();
BigInteger tmp;
vector<int> v_rem;
v_rem.push_back(0);
if (s1==s2)
{
for (int i=0;i<s1;i++)
{
int k=(v_num+b.v_num)%10;
int r=(v_num+b.v_num)/10;
v_rem.push_back(r);
tmp.v_num.push_back((k+v_rem)%10);
}
}
else if (s1>s2)
{
for (int i=0;i<s2;i++)
{
int k=(v_num+b.v_num+v_rem)%10;
int r=(v_num+b.v_num+v_rem)/10;
v_rem.push_back(r);
tmp.v_num.push_back((k));
}
for (i=s2;i<s1;i++)
{
int k=(v_num+v_rem)%10;
int r=(v_num+v_rem)/10;
v_rem.push_back(r);
tmp.v_num.push_back((k));
}
}
else if (s1<s2)
{
for (int i=0;i<s1;i++)
{
int k=(v_num+b.v_num+v_rem)%10;
int r=(v_num+b.v_num+v_rem)/10;
v_rem.push_back(r);
tmp.v_num.push_back((k));
}
for (i=s1;i<s2;i++)
{
int k=(b.v_num+v_rem)%10;
int r=(b.v_num+v_rem)/10;
v_rem.push_back(r);
tmp.v_num.push_back((k));
}
}
if(v_rem[v_rem.size()-1]!=0)
tmp.v_num.push_back(v_rem[v_rem.size()-1]);
for (int i=tmp.v_num.size()-1;i>=0;i--)
{

tmp.num+=(tmp.v_num+48);

}
tmp.sign=sign;
return tmp;
}
return Error;
}
BigInteger BigInteger::mult_num(int n)
{
BigInteger tmp;
vector<int> v_rem;
v_rem.push_back(0);
int s1=num.length();
for (int i=0;i<s1;i++)
{
int k=((v_num*n)+v_rem)%10;
int r=((v_num*n)+v_rem)/10;
v_rem.push_back(r);
tmp.v_num.push_back(k);
}
if(v_rem[v_rem.size()-1]!=0)
tmp.v_num.push_back(v_rem[v_rem.size()-1]);
for (i=tmp.v_num.size()-1;i>=0;i--)
{

tmp.num+=(tmp.v_num+48);

}
return tmp;

}
BigInteger BigInteger::operator=(BigInteger b)
{
this->num=b.num;
this->v_num.clear();
for (int i=this->num.length()-1;i>=0;i--)
{
this->v_num.push_back(num-48);

}
return *this;

}
BigInteger BigInteger::add_R_Zeros(int n)
{
(*this).num.insert((*this).num.size(),n,'0');
this->v_num.clear();
for (int i=num.length()-1;i>=0;i--)
{
this->v_num.push_back(num-48);

}
return *this;
}
BigInteger BigInteger::operator*(BigInteger b)
{
BigInteger tmp;
BigInteger tmp1;
for (int i=b.num.size()-1;i>=0;i--)
{
tmp1=((*this).mult_num(b.num-48)).add_R_Zeros(b.num.size()-1-i);
tmp=tmp+tmp1;
}
if(this->sign==b.sign) tmp.sign=true;
else tmp.sign=false;
return tmp;

}
int main()
{

BigInteger b("-12057");
BigInteger c("-12766");
(b+c).print();
(b*c).print();
return 0;
}
#include <iostream>

وشكرا لصاحب الموضوع :D

BigInt.rar

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#39

مشاء الله علييكم

اهم شي لا توقفو

متابعين معكم

#40

واضح أخى المستشار أنى أتيت متأخرا

والأخوه لم يعد عندهم أى رغبه فى إكمال الموضوع

خيرها فى غيرها إن شاء الله

:ty:

:unsure:

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#41

مشكورين اخوتي بس احنا محتاجين لتكوين مكتبة بالارقام الكبيرة انا سمعت ان فيه مكتبة خاصة اسمها gmplib وهي تشمل كل الارقام الصحيحة والكسرية وغيرها حجمها كبير جدا لكن كنت ابحث في المواقع عن كيفية انشاء هذه المكاتب لاني محتاج لان استخدم مكتبة خاصة ببرنامج يستعمل الارقام الكبيرة جدا

تم تعديل هذه المشاركة بواسطة apro في 3 يناير 2009 في 16:32

#42

السلام عليكــم ورحمـة الله وبركاتــه

يا اخوتي العباقرة اسمحولي ان ادلو بدلوي معكم مع اني مبتدي جدا جدا بالكاد افقه كلمتين او ثلاث في لغة السي بس ايش رايكم لو حولنا

الارقام العشرية الى ارقام ثنائية وقمنا عليها بعملية الجمع والضرب والقسمة ولنفرض ان العدد 9 يمثل بعدد 00001001 والعدد 7 والذي يمثل بالرقم 00000111

00001001

00000111 +

---------

00010000

وانتم وشطارتكم يا عباقرة

#43

السلام عليكم

هذه محاولة مني لحساب عمليات الجمع والطرح والضرب والقسمة بالنسبة للأعداد العشرية بإستخدام لغة البرمجة c وبإستخدام دوال سهلة وفي متناول الجميع.

حيث يقوم بالعمليات حتى 256 رقم.

ولكنه محتاج إلى تعديلات كثيرة ويحتاج إلى تحويله إلى C++ OOP.

وأترك لكم البرنامج

#include <iostream>
#include <cstring>
using namespace std;

int CharToInt(char ch);
bool Grand(string x, string y);
bool Grande(string x, string y);
bool Egale(string x, string y);
bool iszero(string x);
void preparation(string & x, string & y);
void preparing(string &x);
void prepForDiv(string &x, string &y);
string Tabdil(string str);
string So(string x, string y);
string Di(string x, string y);
string Pr(string x, string y);
string Div(string x, string y);


int main(){
    string x = "00123456545465467.1246546465452120";
    string y = "012146546577.12121000";
                            cout<<"x+y = "<<So(x,y)<<endl;
                            cout<<"x-y = "<<Di(x,y)<<endl;
                            cout<<"x*y = "<<Pr(x,y)<<endl;
                            cout<<"x/y = "<<Div(x,y)<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}

//Char to integer
int CharToInt(char ch){ 
    return int(ch)-48;
    }
//X plus grand que Y ou l'inverse
bool Grand(string x, string y){
     preparation(x, y);
     bool a = true;
     int i = 0;
for(i=0;i<x.length();i++){
                          if(x!='.'){
                                 if(CharToInt(x)>CharToInt(y))
                                 return a;
                                 if(CharToInt(x)<CharToInt(y))
                                 return !a;
                                 }
                                 }
return a;
     }
bool Grande(string x, string y){
     preparation(x, y);
     int i = 0;
for(i=0;i<x.length();i++)
                          if(x!='.'){
                                 if(CharToInt(x)>CharToInt(y))
                                 return true;
                                 if(CharToInt(x)<CharToInt(y))
                                 return false;
                                 }

     }
bool Egale(string x, string y){
     preparation(x,y);
     bool res = false;
     int i = 0;
for(i=0;i<x.length();i++)
                          if(x!=y)
                                 return res;
return !res;
     }
//Changement de l'ordre
string Tabdil(string str){
       int i=0;
       for(i=0;i<str.length()/2;i++)
swap(str,str[str.length()-i-1]);
return str;
       }
//Preparation de x et y
void preparation(string & x, string & y){

int i =0;
int diff1 = 0;
int diff2 = 0;
if(x.find(".")<=256){
                    //for(i=1+x.find(".");i<x.length();i++)
                    diff1+=x.length()-x.find(".")-1;
                    //for(i=0;i<x.find(".");i++)
                    diff2+=x.find(".");
                    }
if(x.find(".")>256){
                    diff2+=x.length();

                    }                    
if(y.find(".")<=256){
                     //for(i=1+y.find(".");i<y.length();i++)
                     diff1-=y.length()-y.find(".")-1;
                     //for(i=0;i<y.find(".");i++)
                     diff2-=y.find(".");
                     }
if(y.find(".")>256){
                    diff2-=y.length();

                    }  
                    if(y.find(".")>256 && x.find(".")<=256)
                    y+=".";
                    if(x.find(".")>256 && y.find(".")<=256)
                    x+=".";
if(diff1>0)
for(i=0;i<diff1 ;i++)
y+="0";
if(diff1<0)
for(i=0;i<-diff1;i++)
x+="0";
if(diff2>0)
y.insert(0,diff2,'0'); 
if(diff2<0)
x.insert(0,-diff2,'0'); 
}

//Sommation x+y
string So(string x, string y){
       preparation( x,  y);
       int i=0, s=0, r=0, j=0;
string tot = "";
for(i=x.length()-1;i>=0;i--){
                 if(x!='.'){
                 s=CharToInt(x)+CharToInt(y)+r;
                 r=s/10; /*La partie floate*/
                 j=(s>9)?s%10:s; /*Le reste*/
                 tot+=char(j+48); 
                 }
                 if(x=='.')
                 tot+=".";
                 }
if(r)
tot+=char(r+48);
tot=Tabdil(tot);
preparing(tot);
return tot;
}
//Differencement x-y
string Di(string x, string y){
     preparation(x, y);  
int i=0, s=0, r=0;
string dife = "";
if(Grand(x, y))
{
for(i=x.length()-1;i>=0;i--){
                             if(x!='.'){
                 if(CharToInt(x)-CharToInt(y)-r<0)
                 {
                 s=10+CharToInt(x)-CharToInt(y)-r;
                 r=1;
                 }
                 if(CharToInt(x)-CharToInt(y)-r>=0)
                 {
                 s=CharToInt(x)-CharToInt(y)-r;
                 r=0;
                 }
                 dife+=char(s+48);
                 }
                 if(x=='.')
                 dife+=".";
                 }
}
if(!Grand(x, y))
{

for(i=x.length()-1;i>=0;i--){
                             if(x!='.'){
                 if(CharToInt(y)-CharToInt(x)-r<0)
                 {
                 s=10+CharToInt(y)-CharToInt(x)-r;
                 r=1;
                 }
                 if(CharToInt(y)-CharToInt(x)-r>=0)
                 {
                 s=CharToInt(y)-CharToInt(x)-r;
                 r=0;
                 }
dife+=char(s+48);
}
if(x=='.')
dife+=".";
}
dife+="-";
}
dife=Tabdil(dife);
preparing(dife);
return dife;
}

string Pr(string x, string y){
       int i=0, l=0, s=0, r=0, j=0, Pos=0;
string tot[256] = "";
string str ="";
string result ="";
for(i=x.length()-1;i>=0;i--){
                 if(x!='.'){
                               tot+=str;
                               for(l=y.length()-1;l>=0;l--)
                               {
                                        if(y[l]!='.'){
                                         s=(CharToInt(x)*CharToInt(y[l]))+r;
                                         r=s/10; 
                                         j=(s>9)?s%10:s; 
                                         tot+=char(j+48);
                                         }
                               }
                                if(r)
                                tot+=char(r+48);
                                r=0;
                                str+="0";
                                result = So(result, Tabdil(tot));
                                }
                  }
if(y.find(".")<=256)
Pos+=y.length()-y.find(".")-1;
if(x.find(".")<=256)
Pos+=x.length()-x.find(".")-1;
if(Pos)
result.insert(result.length()-Pos,1,'.');
preparing(result);
return result;
}

bool iszero(string x){
     int i = 0;
     int res = 0;
     for(i=0;x!='\0';i++)
     res += CharToInt(x);
     if(res == 0)
     return true;
     if(res != 0)
     return false;
     }
string Div(string x, string y){
       prepForDiv(x,y);
int size = y.length();
string num = "";
string res = "";
string result = "";
string j = "0";
int i = 0;
int k=0;
if(iszero(y))
return "Infinity";
if(Grand(y,x))
for(i=0;i<y.length()-x.length();i++)
                       x.insert(0,y.length()-x.length(),'0'); 

if(Grand(x,y))
for(i=0;y!='\0';i++)
                       num+=x;




while(k<=255 && !iszero(num)){
                                   while(Grand(num,Pr(y,j)))
                                   j=So(j,"1");
                                   res=Di(j,"1");
                                   result+=res;    

                      num=Di(num,Pr(res,y));
                      if(k<x.length()-size)
                      num+=x[size+k];
                      j="0";
                      k++;
                      if(k==x.length()-size+1){
                        result+=".";
                        num+="0";                                 
                                    }
                      if(k>x.length()-size+1){

                        num+="0";                                 
                                    }

         }

preparing(result);
return result;
}

void preparing(string &x){

int i = 0;
int k = 0;
int l = 0;
string res = "";
string resAv = "";
string resAp = "";
                     if(x.find(".")>256){
                     for(i=0;x!='\0';i++){
                     k+=CharToInt(x);
                     if(k!=0)
                     res+=x;
                     }
                     if(k==0)
                     res="0";
                     }
                    if(x.find(".")<=256){
                         for(i=0;x!='.';i++){
                         k+=CharToInt(x);
                         if(k!=0)
                         resAv+=x;
                         }
                         if(k==0)
                         resAv="0";
                         for(i=x.length()-1;x!='.';i--){
                         l+=CharToInt(x);
                         if(l!=0)
                         resAp+=x;
                         }
                         if(l!=0)
                         resAp+=".";
                         resAp=Tabdil(resAp);
                         res+=resAv+resAp;
                     }
                     x=res;
     }
void prepForDiv(string &x, string &y){
     preparation(x,y);

     string xf = "";
     string yf = "";
     int i = 0;
     for(i=0;x!='\0';i++)
     if(x!='.' && y!='.'){
                   xf+=x;
                   yf+=y;
                   }
                   x=xf;
                   y=yf;
     preparing(x);
     preparing(y);

     }

كما يمكن التأكد من عملية القسمة مثلا من موقع ماتيماتيكا

http://www.wolframalpha.com/

تم تعديل هذه المشاركة بواسطة Mohamed Amine Tag في 10 أغسطس 2011 في 01:28

مواضيع مشابهة