PDA

View Full Version : سوال: برنامه جمع دو عدد اعشاری - بدون استفاده از float و double



online98
یک شنبه 08 بهمن 1391, 16:01 عصر
سلام دوستان ، خسته نباشید
میخواستم بدونم چطوری میشه دو عدد اعشاری را بدون استفاده از متغیر های float ، double بدست آورد !!؟!؟!
مثلا از char ، string استفاده بشه
اگه کسی میتونه بنویسه یا الگوریتمش را بهم بگید

با تشکر فراوان . . . :قلب:

maktoom
یک شنبه 08 بهمن 1391, 19:33 عصر
سلام
توی ضرب ریاضی این موضوع چیکار می کنیم؟ باید همونکارو شبیه سازی کنین.
فقط باید مجموع تعداد بعد ارقام بعد اعشار دو عدد رو داشته باشید تا بعد از ضرب به این اندازه برید جلو و بعد یه خونه شیفت بدید و نقطه رو در رشتتون جاگذاری کنید.

online98
یک شنبه 08 بهمن 1391, 20:29 عصر
اگه میشه یه کد بذارید ، متوجه نشدم
خیلی ممنون

maktoom
یک شنبه 08 بهمن 1391, 22:54 عصر
گام اول: با اعلام اینکه دو عدد اعشاری وارد کن دو مقدار رو توی دوتا رشته میریزید.
گام دوم:با دو تا حلقه متوجه میشید مجموعا چنتا عدد بعد از اعشار وجود دارد.
گام سوم:در گام بعدی دو عدد رو بدن اعشار در هم ضرب می کنید.
گام چهارم:در گام بعد عدد رو در یک رشته قرار می دید با این تفاوت که بعد از مجموعه تعداد ارقام اعشار دو عدد اولیه علامت اعشار میذارید.
گام پنجم:بقیه ارقام عد حاصلضرب رو از بعد از اعشار قرار میدید.(داخل رشته)
گام ششم:رشته رو چاپ می کنید.

این صرفا راه حلیه که به ذهن من رسیده. ممکنه ریزه کاری هم داشته باشه.
بنویسید اگه مشکلی بود مطرح کنید تا دوستان رفعش کنن.

Mr.Programmer
دوشنبه 05 فروردین 1392, 15:35 عصر
بفرمایید ;)
#include <iostream>
#include <string>

using namespace std;


void Split_Number(string,string,string&,string&,string&,string&);
void FillZero(string&,string&);
void Calculate_Ashar(string&,string&,string&,bool&);
void Calculate_Sahih(string& ,string&,string&,bool&);
void Remove_Zero(string&);
string Convert_To_String(int);
int Convert_To_Int(string);
string Str_Reverce(string); // baraye makoos kardane ashar . . .

int main()
{
char y='y';

while (y=='y' || y=='Y')
{
string Javab_Ashar="";
string Javab_Sahih="";
// get number a va b
string FirsNumber;
string SecondNumber;
cout<<"enter the first number: ";
getline(cin,FirsNumber);
cout<<"enter the second number: ";
getline(cin,SecondNumber);

string x1="",x2="",y1="",y2="";

Split_Number(FirsNumber,SecondNumber,x1,x2,y1,y2); // joda kardan ghesmate sahih va ashar va rikhtan dar motoghayer haye x1,x2,y1,y2
FillZero(x2,y2); // yeksan kardan ghesmate ashare 2 ragham
bool one=false;
Calculate_Ashar(x2,y2,Javab_Ashar,one); //void Calculate_Ashar(string&,string&,string&,bool&);

Calculate_Sahih(x1,y1,Javab_Sahih,one);

Remove_Zero(Javab_Ashar); //void Remove_Zero(string&);

if (Javab_Ashar[0]=='0' && Javab_Ashar.length()==1)
cout<<endl<<"Javab = "<<Javab_Sahih<<endl;
else
cout<<endl<<"Javab = "<<Javab_Sahih<<"."<<Javab_Ashar<<endl;

cout<<endl<<"Do you want to continue? (y/n): ";
cin>>y;
cout<<"____________________________________"<<endl<<endl;
cin.ignore();
}


}



void Split_Number(string a1,string b1,string& x1 ,string& x2,string& y1, string& y2)
{
bool flag1=false;
bool flag2=false;

for (unsigned int i = 0; i < a1.length(); i++)
{
if (a1[i]=='.')
{
flag1=true; // adad ashari hast
}
}

for (unsigned int i = 0; i < b1.length(); i++)
{
if (b1[i]=='.')
{
flag2=true; // adad ashari hast
}
}
if (flag1==true) // dar sorate ashari bodan : x1 = ghesmate sahih , x2=ghesmate ashari
{
unsigned int posA = a1.find(".");
x1=a1.substr(0,posA); // ghesmate sahih ( az 0 ta . )
x2 = a1.substr (posA+1); // ghesmate ashari ( az . ta akhar )
}
else // dar sorate ashari naboodan : x1=ghesmate sahih , x2=0
{
x1=a1;
x2="0";
}

if (flag2==true) // manand bala ( baraye adade dovom )
{
unsigned int posB = b1.find(".");
y1=b1.substr(0,posB);
y2 = b1.substr (posB+1);
}
else
{
y1=b1;
y2="0";
}
return;
}

void FillZero(string& x2,string& y2)
{
while (x2.length() > y2.length())
{
y2+='0';
}

while (y2.length() > x2.length())
{
x2+='0';
}
}

void Calculate_Ashar(string& x2,string& y2,string& Javab_Ashar,bool& one)
{
string temp="";
string temp1;
string temp2;

int r2=0;
int r4=0;
int sumHelp0=0;
int sumHelp1=0;
bool flg1=false;
one=false;

string strSumHelp="";
for (int i = x2.length()-1; i >= 0; i--)
{
temp1=x2[i];
temp2=y2[i];
r2=Convert_To_Int(temp1);
r4=Convert_To_Int(temp2);


bool found=false;

sumHelp1=r2+r4;

if (one==true)
{
sumHelp1=(r2+r4)+1;
one=false;
found=true;
}
else
{
sumHelp1=r2+r4;
}


if (sumHelp1>=10)
{
flg1=true;
}
if (flg1==true)
{
if (found==true)
{
sumHelp1=(r2+r4+1)-10;
}
else
{
sumHelp1=(r2+r4)-10;
}

one=true;
flg1=false;
}
else
{
if (found==true)
{
sumHelp1=(r2+r4)+1;
}
else
{
sumHelp1=r2+r4;
}

}
strSumHelp=Convert_To_String(sumHelp1);
temp+=strSumHelp;
}
one=one; // send true or false
Javab_Ashar=Str_Reverce(temp);
return;
}

void Calculate_Sahih(string& x1,string& x2, string& Javab_Sahih,bool& one)
{
int r1=Convert_To_Int(x1);
int r3=Convert_To_Int(x2);
int ReturnValue=0;

if (one==true)
ReturnValue=(r1+r3)+1;
else
ReturnValue=r1+r3;

Javab_Sahih=Convert_To_String(ReturnValue);
return;
}

void Remove_Zero(string& Javab_Ashar)
{
unsigned int posB;
bool flg=false;
//y1=b1.substr(0,posB);
// y2 = b1.substr (posB+1);

if (Javab_Ashar[0]!='0')
{
for (int i = Javab_Ashar.length()-1 ; i >=0 ; i--)
{
if (Javab_Ashar[i]!='0' && flg==false)
{
flg=true;
posB=i;
}
}
Javab_Ashar=Javab_Ashar.substr(0,posB+1);
}
}

int Convert_To_Int(string str)
{
int number;
number=atoi(str.c_str());
return number;
}

string Convert_To_String(int number)
{
if (number == 0)
return "0";
string temp="";
string returnvalue="";
while (number>0)
{
temp+=number%10+48;
number/=10;
}
for (unsigned int i=0;i<temp.length();i++)
returnvalue+=temp[temp.length()-i-1];
return returnvalue;
//Ya :
//#include <sstream>
//stringstream ss; //create a stringstream
//ss << number; //add number to the stream
//return ss.str(); //return a string with the contents of the stream
}

string Str_Reverce(string str)
{
string temp="";
for (int i = str.length()-1; i >= 0; i--)
{
temp+=str[i];
}
return temp;
}