PDA

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



raranjbar
یک شنبه 02 اسفند 1388, 22:58 عصر
میخواستم دو عدد اعشاری رو با هم جمع کنم و نتیجه رو مشاهده کنم ولی با این شرط که فرض کنیم هنوز نوع داده اعشاری یعنی double یا float وجود ندارد

مثلا"
968.09+283.919

Salar Ashgi
دوشنبه 03 اسفند 1388, 11:43 صبح
کار زیاد سختی نیست ، همون کاری رو که شما برای جمع کردن معمولی اعداد (صحیح ) انجام میدین ،

در مورد اعداد اعشاری هم همینطوره .

simul8or
سه شنبه 04 اسفند 1388, 14:07 عصر
سوال شما واضح نیست. می توانید بیشتر توضیح دهید؟؟ دقیقا قصد انجام چه عملی را دارید؟

raranjbar
چهارشنبه 05 اسفند 1388, 19:44 عصر
سوال شما زیاد واضح نیست. می توانید بیشتر توضیح دهید؟؟ دقیقا چه عملی می خواهید انجام دهید؟

میخواستم دو عدد اعشاری رو با هم جمع کنم و نتیجه رو مشاهده کنم ولی با این شرط که فرض کنیم هنوز نوع داده اعشاری یعنی double یا float وجود ندارد

مثلا"
968.09+283.919

SamanS
چهارشنبه 05 اسفند 1388, 22:03 عصر
برای هر عدد اعشاری از دو تا رشته استفاده کن. یکی برای قسمت صحیح و یکی برای قسمت اعشاری و خودت عمل جمع رو بنویس و رقم به رقم عمل جمع رو انجام بده. مثلاً اگه می‌خوای رقم xi رو با yi جمع کنی و رقم نقلی از مرحله‌ی قبل c باشه اون‌وقت جواب می‌شه:


z[i] = (x[i] + y[i] + c) % 10
رقم نقلی مرحله‌ی بعد هم می‌شه:



c = (x[i] + y[i]] + c) / 10
تابع جمع می‌تون این‌طوری باشه:


char * sum(char * x, char * y, int c)
دفعه‌ی اول قسمت اعشاری رو بفرست که با هم جمع شن. فقط یادت باشه که رقم نقلی نهایی قسمت‌های اعشاری رو یه جا ذخیر کنه تا برای جمع قسمت صحیح ازش استفاده کنی مثلاً اگه بخوای 0.1 رو با 1.9 جمع کنی بعد از انجام جمع قسمت اعشار رقم نقلی داری که باید ازش برای قسمت صحیح استفاده کنی (به همین دلیل هست که تابع sum آرگومان سوم به نام c داره که همون رقم نقلی هست)

simul8or
چهارشنبه 05 اسفند 1388, 23:52 عصر
دوست عزیز کد زیر قسمت صحیح و اعشار را بدون استفاده از float یا double جدا می کند:(مطمئنا این راحت ترین و کوتاهترین کد نیست):


#include <iostream>
#include <cstdlib>

////////////////////
//code by simul8or//
////////////////////
using namespace std ;

int dm(char*);

int main ()
{
char* a=new char;
char* b=new char;

int xi=0,yi=0,xd=0,yd=0;

cin>>a>>b;

xi=atoi(a);
yi=atoi(b);

xd=dm(a);
yd=dm(b);


system("pause");
return 0 ;
}

int dm(char* temp)
{
temp=strchr(temp,'.');
temp[0]='1';
return atoi(temp);
}
قسمت صحیح که به راحتی جمع می شود.
اما قسمت اعشار: به اول تمام اعداد اعشار عدد 1 اضافه شده است، بنابر این اعدادی مانند 005 به صورت 1005 در متغییر از نوع int بدون از دست دادن صفر ها ذخیره می شوند.
حال شما می توانید با نوشتن یک تابع عمل جمع را به صورت زیر انجام دهید:
فرض کنید دو قسمت اعشار 1919 و 109 باید با هم جمع شوند،(یعنی 0.919 و 0.09) برای این کار ابتدا اعداد را معکوس کنید(تابع آن موجود است) اعداد می شوند 9191 و 901 عدد 1 را حذف کنید، اعداد می شوند 919 و 90 و آخرین مرحله جمع این دو عدد است که باید به صورت عکس جمع معمولی صورت گیرد یعنی 9+0 و 1+9 و 9+0 و در هر مرحله کری به جای انتقال به رقم سمت چپ ، به راست می رود. درست عکس عمل جمع عادی. و در آخر با معکوس کردن حاصل جمع، قسمت اعشار نیز بدست می آید.
باز تاکید می کنم این ساده ترین راه نیست.

raranjbar
پنج شنبه 06 اسفند 1388, 17:55 عصر
این برنامه حداکثر دو عدد صحیح 500 رقمی رو با هم جمع میکه ولی نمی دونم چه کدی به این برنامه اضافه کنم تا این برنامه بتونه دو عدد اعشاری رو بدون استفاده از نوع double و float جمع کنه.
#include <IOstream>
#include <String>
using namespace std;

const int Lenght = 500;
void Sum(char *FirstNum,char *SecondNum);
void Rev(char *Str);

int main()
{
char First[Lenght];
char Second[Lenght];
cout << "Type Number" << "\n";
cin >> First >> Second;
Sum(First,Second);
return 0;
}

void Sum(char *FirstNum,char *SecondNum)
{
int iFirstLen,iFirst;
int iSecondLen,iSecond;
int iSum;
int carry = 0;
char cSum[Lenght];
int k = 0;

iFirstLen = strlen(FirstNum) - 1;
iSecondLen = strlen(SecondNum) - 1;

while( iFirstLen >=0 || iSecondLen >=0)
{
iFirst = FirstNum[iFirstLen] - 48;
iSecond = SecondNum[iSecondLen] - 48;

if( iFirstLen < 0 )
iFirst = 0;
if( iSecondLen < 0 )
iSecond = 0 ;

iSum = iFirst + iSecond + carry;
if(iSum > 9)
carry = 1;
else
carry = 0;
cSum[k] = ( iSum % 10 ) + 48;
k++;
iFirstLen --;
iSecondLen--;
}
if( carry == 1)
{
cSum[k] = iSum % 10 + 48;
cSum[k++] = '\0';
}
else
cSum[k] = '\0';
Rev(cSum);
cout << "\n" << cSum << endl;
}
void Rev(char *str)
{
int iStr;
char temp[Lenght];
iStr = strlen(str) - 1 ;
int i = 0;
for(int k = iStr ; k >= 0 ; k--)
{
temp[i] = str[k];
i++;
}
temp[i] = '\0';
strcpy(str,temp);
}

raranjbar
جمعه 07 اسفند 1388, 11:22 صبح
کسی میتونه توضیح بیشتری بده؟

raranjbar
جمعه 07 اسفند 1388, 14:13 عصر
کار زیاد سختی نیست ، همون کاری رو که شما برای جمع کردن معمولی اعداد (صحیح ) انجام میدین ،

در مورد اعداد اعشاری هم همینطوره .

خوب شما که میگید کار سختی نیست یه کم کمک کنید تا معلوم بشه کار سختی هست یا نه

Salar Ashgi
جمعه 07 اسفند 1388, 14:54 عصر
خوب شما که میگید کار سختی نیست یه کم کمک کنید تا معلوم بشه کار سختی هست یا نه
شما تو کاغذ چه جوری دو تا عدد اعشاری رو جمع میکنی ؟

از سمت راست ممیز ...

خوب همینو پیاده سازی کن .

همه چیز رو که آماده (هلو بپر تو گلو) به آدم نمیدن . خودتون هم باید کمی خلاقیت به خرج بدین .

raranjbar
جمعه 07 اسفند 1388, 15:31 عصر
شما تو کاغذ چه جوری دو تا عدد اعشاری رو جمع میکنی ؟

از سمت راست ممیز ...

خوب همینو پیاده سازی کن .

همه چیز رو که آماده (هلو بپر تو گلو) به آدم نمیدن . خودتون هم باید کمی خلاقیت به خرج بدین .

برنامه اصلی رو نوشتم فقط تو ریزه کاری هاش گیر کردم.