با سلام
می خواستم یه کمکی به من بکنید
چه جوری می شه تو زبان ++c متغیرس بسیار بزرگ مثلا 1000 رقمی تعریف کرد و با یه عدد بزرگ دیگه جمع کرد ،تفریق کرد و ازهمه مهمتر ضرب وتقسیم کرد
ممنون
Printable View
با سلام
می خواستم یه کمکی به من بکنید
چه جوری می شه تو زبان ++c متغیرس بسیار بزرگ مثلا 1000 رقمی تعریف کرد و با یه عدد بزرگ دیگه جمع کرد ،تفریق کرد و ازهمه مهمتر ضرب وتقسیم کرد
ممنون
با آرايه ها فكر ميكنم بشه يه كارايي كرد. دو رشته با طول 1001 و يه آرايه هم براي نتيجه (طول آرايه سه بايد نسبي خودت حساب كني)
براي جمع و تفريق و غيره هم بايد براي هر عملگر يه الگوريتم مثل اونايي كه دبستان ياد گرفتيم درست بشه
مثلا جمع كردن ايجوري بود. :biggrin:
کد:1
1 4 6 7
+ 2 1 0 3
----------
3 5 7 0
سلام جناب بد سکتور
آخه قربون تو برم اگه به همین راحتیا بود که وقت انجمن را نمی گرفتم
مگه نمی دونی آرایه هارو نمی تونیم با هم جمع کنیم پس باید دونه دونه اعدادو بکشیم بیرون جمع کنیم تازه باید آرایه سوم رو جوری تعریف کنیم که اگه یه رقم آخر کار بیشتر شد قبول کنه از طرفی طول آرایه باید معلوم باشه ....
فک کنم تا همینجا قانع شده باشی که به همین راحتیا هم نیست
خوشحال می شم اگه نظر دیگه ای هم داری به من بگی
مرسی
بله ميدونم كار مشكلي هست.و چون خودم زياد به c مسلط نيستم فقط يه پيشنهاد حد خودم دادم. ولي شدنيهنقل قول:
نوشته شده توسط mostafa_aa
منظورم هم دقيقا همينه يعني دونه دونه رقم ها رو بيرون بكشيم و اعمال رو نسبت به هر عمرگرد جمع و تفريق و ...نقل قول:
مگه نمی دونی آرایه هارو نمی تونیم با هم جمع کنیم پس باید دونه دونه اعدادو بکشیم بیرون جمع کنیم
محاسبه كنيم و نتيجه رو مستقيم در آرايه سوم قرار بديم. و بعد بريم سراق رقم بعد. آرايه سوم هم مثلا 10 هزار تا بگيرد.
چون شما داري برنامه رو مي نويسي نه ماشين پس بايد حدس بزني رقم تا چه حد ممكنه بزرگ بشه.
به نظر من برنامهاي كه ساختنش راحته و بشه حتي ذهني ساختش اصلا صرف نمي كنه روش وقت بزاري و بنويسيشنقل قول:
فک کنم تا همینجا قانع شده باشی که به همین راحتیا هم نیست
سلام
ببینید همونجوری که دوستمون گفتند باید از آرایه استفاده کنی.
بااید همونجوری که خودت جمع رو رو کاغذ انجام می دی الگوریتمشو پیاده سازی کنی.
مثلا واسه جمع کردن باید ابتدا دو رقم اول اعداد رو با هم جمع کنیم. اگر بزرگتر از 10 بود به جمع ارقام بعدی یک یک اضافه کنی.
1256
4379
9+6 پانزده می شود . پس یکان عدد حاصل 5 است. حال به جمع در رقم بعدی( 5 و 6) یک اضافه می کنیم. که 12 می شود. صدگان را 2 می گذاریم و به مجموع دو رقم بعدی یک اضافه می کنیم.....
بقیه اپراتورها ( - * / ) هم مانند این پیاده سازی می شوند. دقیقا همونجوری که خودت این کار رو انجام می دی.
سلام بچه ها
ممنون از شما دوستانی که کمک کردید
حالا اگه می شه بگید که چه جوری یه آرایه 1000000 رقمی تعریف کرد ؟
بازم ممنون می شم
مخلص .
اينجوري
كه string هم هر اسمي بجز اسمهاي كليدي مي تونه باشه.کد:char string[1000000];
سلام من فكر مي كنم اينجوري كامپايلر error مي ده چون نميشه آرايه بزرگتر از 255 تعريف كرد من فكر مي كنم بايد يا آرايه اي از آرايه ها تعريف كنيد يا آرايه چند بعدي باشه.نقل قول:
نوشته شده توسط Bad.Sector
منظورم از آرايه اي از آرايه ها اينه كه مثلا بنويسيم
typedef int reshteh[255];
داخل برنامه آرايه اي از اين نوع مي نويسيم تازه نمي دونم بشه براي اين عدد خيلي بزرگ كه شما گفتين اين كار رو كرد اما دوبعدي فكر كنم بهتر باشه.
سلام
ممنونم ، مشکل حل شد
بهتره كه چنين مبحث هايي, در مكانهايي كه مربوط به "ساختمان داده ها" باشه مطرح بشه. فكر نكنم چنين مشكلاتي به زبان برنامه نويسي برگرده.
سلام دوستان
اه امکانش هست سورس جمع و ضرب دو عدد 20 رقمی رو بزارین
بهش خیلی نیاز دارم
ممنونم.
سلام.خوبي.
اگه اون جواب 10000 رقمي رو بدست اوردي.
يه كپي به ميلم بفرست.چون خيلي احتياج دارم.
ممنون
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
سلام
اگر دانشجوي كامپيوتر باشيد به ياد داري كه در طراحي الگوريتم ها براي اعداد بسيار بزرگي كه در موقع جمع كردن سرريز مي شوند و يا اعدادي كه بسيار بزرگند متغيير هايي تعريف مي كرديم واعداد شكسته شده را در آن مي ريختيم و اين كار شكستن را انقدر ادامه مي داديم كه ديگر نيازي به شكستن نباشد وبعد مرتبا انها را باهم جمع مي كنيم و در يكي از متغيير ها مي ريزيم تا نهايتا عدد نهايي ساخته شود
اميدوارم فهميده باشيد
سلام به همگي
اين سوال رو من نوشتم البته ضربشو و با آرايه ولي متاسفانه تا 20 رقم
#include<iostream.h>
#include<conio.h>
void main(void)
{
l:
int a[10],b[10],c[20],i,j,k,temp=0,bagi=0,temp1=0,sefr=0,key=0;
char ch;
cout<<"----------------------------------START------------------------------------------";
cout<<endl;
for (i=0;i<10;i++)
{
cout<<"Please Enter The Frist Number "<<i<<"=";
cin>>a[i];
}
for (i=0;i<10;i++)
{
cout<<"Please Enter The Second Number "<<i<<"=";
cin>>b[i];
}
for (i=0;i<20;i++)
c[i]=0;
for (i=9;i>=0;--i)
{
temp=0;
bagi=0;
temp1=0;
for (j=9;j>=0;--j)
{
k=b[i]*a[j]+temp;
temp=k / 10;
bagi=k % 10;
c[(j-sefr)+10]=c[(j-sefr)+10]+bagi+temp1;
temp1=c[(j-sefr+10)]/10;
c[(j-sefr)+10]=c[(j-sefr)+10]%10;
if (j==0)
{
c[(j-sefr)+9]=temp;
c[(j-sefr)+9]=c[(j-sefr)+9]+temp1;
}
}
++sefr;
}
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"Result: ";
for (i=0;i<10;i++)
{
cout<<a[i];
}
cout<<" * ";
for (i=0;i<10;i++)
{
cout<<b[i];
}
cout<<" = ";
for (i=0;i<20;i++)
{
cout<<c[i];
}
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"Press 1 & Enter To Cuntinue Press Any Key & Enter For Exit...";
cin>>key;
if (key==1)
goto l;
}
يه الگوريتم ساده
كه ابتدا دو تا عدد ده رقمي رو مي گيره وداخل آرايه قرار مي ده و سپس از آخر به همان روش ضرب ابتدايي با هم ضرب مي كنه و اگر عدد بزرگتر از 10 شد با قي مونده اونو حساب كرده و سپس خارج قسمت رو بدست آورده و به خانه ي بعدي اضافه مي كنه به همين سادگي
عمرا اگه فهميده باشي
سلام
واسه این کار از پشته پیوندی باید استفاده کنی (البته همونطور که دوستان هم گفتن از آرایه میتونی استفاده کنی ولی این کار بهیچ وجه توصیه نمیشه و از لحاظ مهندسی نرم افزار هم یک کار اشتباهه)
برای شروع کافیه 2 تا پشته ایجاد کنی (اعضای پشته byte ) توابع حذف و اضافه node رو بنویسی (بصورت پیوندی) و در نهایت در زمان اجرا با فشردن هر کاراکتر یکی به پشته ات اضافه کنه(در صورتی که ورودی قابل قبول باشه) و با فشرن هربار کلید بک اسپیس (کاراکتر 8 ) یک گره حذف کنه ، در نهایت یه پشته پر داری ولی یه مشکل هست اگه بخوای نمایشش بدی رشته رو معکوس نمایش میده اگه نخوای خیلی وقتت گرفته بشه کافیه STACK رو معکوس کنی و نمایشش بدی ولی اگه هدفت جمع یا تفریقه پیش از اینکه پشته رو معکوس کنی عمل جمع یا تفریق رو به راحتی میتونی انجام بدی و در نهایت پشته رو معکوس کنی .
چند ترم پیش یه برنامه عدد 60 رقمی واسه یکی از بچه ها نوشته بودم اگه پیداش کردم واست میزارم کمکت میکنه
کسی الگوریتم تفریق را با استفاده از رقم نقلی و آرایه بلده؟
من یه برنامه ای نوشتم ولی درست کار نمیکنه؟اگه با تصحیح همین برنامه الگوریتم تفریق درست کار کنه ممنون میشم چون میتونم راحت بفهمم چی به چیه؟
#include <conio.h>
#include <stdio.h>
#include <string.h>
main()
{
char num1[50],num2[50],javab[50],help[50];
int i,j,carry=0,r,x11,x22,k=0,sw=0,sz=1;
clrscr();
gets(num1);
gets(num2);
if (strlen(num1)<strlen(num2))
{
strcpy(help,num1);
strcpy(num1,num2);
strcpy(num2,help);
sz=-1;
}
else if (strlen(num1)==strlen(num2))
{
if (num1[0]<num2[0])
{
strcpy(help,num1);
strcpy(num1,num2);
strcpy(num2,help);
sz=-1;
}
}
i=strlen(num1)-1;
j=strlen(num2)-1;
for(;i>=0||j>=0;i--,j--)
{
if(i>=0)
{
x11=num1[i]-48;
if(sw==1)
{
x11=num1[i]-49;
sw=0;
}
}
else
x11=0;
if(j>=0)
x22=num2[i]-48;
else
x22=0;
if (x11<x22)
{
x11=x11+10;
r=x11-x22+carry;
sw=1;
}
else
r=x11-x22+carry;
javab[k++]=(r%10)+48;
carry=r/10;
}//end for
javab[k]='\0';
strrev(javab);
if (sz==-1)
printf ("result is:-%s",javab);
else
printf("result is:%s",javab);
getch();
}//end main
كد زيرو ببين
مشكلي داشتي بپرس
کد://tavojoh tamam adade aval bayad bozorgtar bashand
#include <iostream>
using namespace std;
typedef int UI;
typedef char cint;
class Int
{
public:
Int():itsBigNumber(0){}
Int(char*);
~Int();
Int operator = (Int rhs);
UI operator [] (int offset) { return itsBigNumber[offset]; }
UI* GetInt() const { return itsBigNumber; }
Int operator + (Int);
Int operator - (Int);
Int operator * (Int);
friend ostream operator <<(ostream os,Int big)
{
for(int i=0;i<big.itsTemp;i++)
os <<(big.GetInt())[i];
os <<endl;
return os;
}
private:
UI* itsBigNumber;
int itsTemp;
};
Int::Int(char* big)
{
int itsLen = itsTemp = strlen(big)+1;
itsBigNumber = new UI[itsLen];
for(int i=1;i<itsLen;i++)
itsBigNumber[i] = big[i-1]-'0';
itsBigNumber[0] = 0;
}
Int Int::operator = (Int rhs)
{
if(this == &rhs)
return *this;
delete [] this->itsBigNumber;
this->itsBigNumber = 0;
itsBigNumber = new UI[rhs.itsTemp];
for(int i = 0;i < rhs.itsTemp;i++)
this->itsBigNumber[i] = rhs.itsBigNumber[i];
return *this;
}
Int Int::operator + (Int num)
{
int carry = 0;
if(this->itsTemp > num.itsTemp || this->itsTemp == num.itsTemp)
{
for(int i = this->itsTemp,j = num.itsTemp;
i >= 0 && j >= 0;i--,j--)
{
if(this->itsBigNumber[i] + num.itsBigNumber[j] + carry > 9)
{
int item = (this->itsBigNumber[i] +
num.itsBigNumber[j])- 10;
this->itsBigNumber[i] = item + carry;
carry = 1;
if(j == 0)
{
num.itsBigNumber[j] = 0;
j = 1;
}
}
else
if(this->itsBigNumber[i] +
num.itsBigNumber[j] + carry <= 9)
{
this->itsBigNumber[i] =
this->itsBigNumber[i] + num.itsBigNumber[j]
+ carry;
carry = 0;
if(i != 0 && j == 0)
{
num.itsBigNumber[j] = 0;
j = 1;
}
}
}
}
else
{
cout <<"there is one problem...\n";
return NULL;
}
return *this;
}
Int Int::operator - (Int num)
{
int carry = 0;
if(this->itsTemp > num.itsTemp || this->itsTemp == num.itsTemp)
{
if(this->itsTemp == num.itsTemp)
for(int k = 0;k < num.itsTemp;k++)
if(num.itsBigNumber[k] > this->itsBigNumber[k])
{
cout <<"there is one problem...\n";
return NULL;
}
for(int i = this->itsTemp,j = num.itsTemp;i >= 0 && j >= 0;
i--,j--)
{
if(this->itsBigNumber[i] - num.itsBigNumber[j] - carry < 0)
{
int item = (this->itsBigNumber[i] + 10) -
num.itsBigNumber[j] - carry;
this->itsBigNumber[i] = item - carry;
carry = 1;
if(i != 0 && j == 0)
{
num.itsBigNumber[j] = 0;
j = 1;
}
}
else
if(this->itsBigNumber[i] - num.itsBigNumber[j] - carry >= 0)
{
this->itsBigNumber[i] = this->itsBigNumber[i] -
num.itsBigNumber[j] - carry;
carry = 0;
if(i != 0 && j == 0)
{
num.itsBigNumber[j] = 0;
j = 1;
}
}
}
}
else
{
cout <<"there is one problem...\n";
return NULL;
}
return *this;
}
Int Int::operator * (Int num)
{
Int item = "1";
Int temp = *this;
for(Int i = num;i.itsBigNumber[1] == 0;i - item)
*this = *this + temp;
return *this;
}
Int::~Int()
{
delete [] itsBigNumber;
itsBigNumber = 0;
}
int main()
{
cint one[20000],two[20000];
cout <<"one:";
cin.getline(one,19999);
cout <<"\ntwo:";
cin.getline(two,19999);
Int One = one;
Int Two = two;
Int Three = One + Two;
cout <<"\n-->\t"<<Three;
return 0;
}
بالاخره برنامه تفریق دو رشته رو تقریبا کامل نوشتم
#include <conio.h>
#include <stdio.h>
#include <string.h>
main()
{
char num1[50],num2[50],javab[50],help[50];
int i,j,carry=0,r,x11,x22,sw=0,k=0,sz=1;
clrscr();
gets(num1);
gets(num2);
if (strlen(num1)<strlen(num2))
{
strcpy(help,num1);
strcpy(num1,num2);
strcpy(num2,help);
sz=-1;
}
i=strlen(num1)-1;
j=strlen(num2)-1;
for(;i>=0||j>=0;i--,j--)
{
if(i>=0)
x11=num1[i]-48;
else
x11=0;
if(j>=0)
x22=num2[j]-48;
else
x22=0;
if (sw==1)
if (x11<x22)
{
x11=x11+9;
r=x11-x22+carry;
}
else if (x11>x22)
{
x11=x11-1;
r=x11-x22+carry;
sw=0;
}
else //x11==x22
{
x11=x11+9;
r=x11-x22+carry;
}
if (sw==0)
if (x11<x22)
{
x11=x11+10;
r=x11-x22+carry;
sw=1;
}
else //x11>x22
r=x11-x22+carry;
javab[k++]=(r%10)+48;
carry=r/10;
}//end for
javab[k]='\0';
strrev(javab);
if (sz==-1)
printf ("-%s",javab);
else
printf("%s",javab);
getch();
}//end main