View Full Version : سوال: ضرب دو عدد 100 رقمی در هم!؟!
silentrise
سه شنبه 17 دی 1387, 00:29 صبح
سلام
فکنم از عنوان متوجه سوال شده باشید!
ضرب دو عدد 100 رقمی در هم و نشان دادن خروجی! چگونه؟
با سپاس
Saeed_m_Farid
سه شنبه 17 دی 1387, 10:12 صبح
سلام
فکنم از عنوان متوجه سوال شده باشید!
ضرب دو عدد 100 رقمی در هم و نشان دادن خروجی! چگونه؟
با سپاس
اين موضوع مكررا تو جاهاي ديگه بخش تكرار شده و شما هم بدون جستجو دوباره دارين تاپيك ميزنيد. جستجو كنيد اعداد بزرگ رو تو بخش سي.
ضمنا يكي از دوستان دقيقا همين كار رو انجام دادن بدون كلاس و سربارگذاري عملگرها و مسائل پيچيده. از درست يا غلط بودن برنامشون مطمئن نيستم.
جمع و ضرب اعداد n رقمی با استفاده از لیست پیوندی (http://www.barnamenevis.org/forum/showthread.php?t=112354)
اين جواب رو دادم تا مدير بخش تاپيك شما رو حذف نكنه و اگه بعدا كسي مراجعه كرد بدرد بخوره ولي يه ضرب المثل معروف دسته بندي دنياي سايبر هست كه ميگه:
انسانها به دو بخش تقسيم ميشن: اونايي كه باينري ميفهمند و اونايي كه باينري نمي فهمند يه بخش ديگه هم هستن كه نميتونن جستجو كنند.
اميدوارم زياد جمله اش رو خراب نكرده باشم!:خجالت:
با تشكر.
silentrise
جمعه 20 دی 1387, 04:23 صبح
سلام
من برنامه رو با روش روستایی نوشتم ولی الان دوست دارم بهینه بشه اگه کسی کمک کنه ممنون میشم!
تو فایل ضمیمه می تونید برنامه رو ببینید,البته من برای زیبایی خروجی 39 *39 حساب کردم!
راستی آقای Saeed_m_Farid دوباره به خودم ثابت شد که برنامه نویسی Syntax بلد بودن یا شعار دادن نیست!
به هر حال سپاس
Saeed_m_Farid
جمعه 20 دی 1387, 11:02 صبح
سلام دوست عزيز
چند تا سوال (و نكته) ميخوام عرض كنم :
1- روش روستايي يعني چي؟
2- اگه قرار باشه اندازه آرايه شما متغير باشه يا از ورودي عددها رو بگيرين كل برنامه تحت تاثير قرار ميگيره اونوقت چي كار بايد بكنين؟ نميشه كه واسه هر تغيير ورودي شما كدتون رو اصلاح كنيد.
دوباره به خودم ثابت شد که برنامه نویسی Syntax بلد بودن یا شعار دادن نیست! 3- منظورتون رو متوجه نشدم، ميبخشي يه مقدار خنگم و فقط syntax بلدم ولي فكر كنم شما هم يه مقدار دوپهلو صحبت فرموديد.
الان دوست دارم بهینه بشه 4- بهينه شدن تا چه حد واستون لازمه؟ اگه واسه تحويل پروژه تون ميخواين، نمونه هايي كه تو پست قبلي اشاره شد جوابتون رو ميدن ولي اگه واسه يه كار كابردي ميخواين و يه كد كامل كه تمام عملگرها رو شامل بشه يه كلاس هست كه از اينجا (http://www.aachp.ir/post.aspx?no=100) ميتونين بردارينش و توسط آقاي مسعود اقدسي فام (http://www.aachp.ir/profiles.aspx?no=1) نوشته شده كه اين كد پايين هم قسمت ضربش هست : من الان دارم اين هدر رو با اجازه ايشون (نويسنده برنامه) تو پروژه هامون استفاده ميكنم و نقص هاي خيلي كمي داشت كه با همفكري حل شد و يه يونيت تقريبا كامل و كاربردي شده (هموني كه لينكش رو دادم) كه تو سي شارپ هم تقريبا همين كلاس رو پياده سازي كرده و دارم استفاده ميكنم.
BigInteger operator * ( const BigInteger &r ) const
{
BigInteger temp;
if( !data || !r.data )
return temp;
if( *this == "0" || r == "0" )
{
temp.data = new char[ 1 ];
if( temp.data )
{
temp.size = 1;
temp.sign = false;
temp.data[ 0 ] = '0';
return temp;
}
}
vector< unsigned > v( size + r.size );
unsigned i, j, t, c;
for( i = 0 ; i < size ; i++ )
{
c = 0;
for( j = 0 ; j < r.size ; j++ )
{
t = v[ i + j ];
v[ i + j ] = ( t + c + ( data[ i ] - '0' ) * ( r.data[ j ] - '0') ) % 10;
c = ( t + c + ( data[ i ] - '0' ) * ( r.data[ j ] - '0' ) ) / 10;
}
if( c )
v[ i + j ] = c;
}
for( i = 0 ; i < v.size() ; i++ )
if( v[ v.size() - i - 1 ] != 0 )
break;
temp.data = new char[ v.size() ];
if( temp.data )
{
temp.size = v.size() - i;
temp.sign = ( sign && !r.sign ) || ( !sign && r.sign );
for( j = 0 ; j < temp.size ; j++ )
temp.data[ j ] = v[ j ] + '0';
}
return temp;
}
5- تو اين مدت كمي كه اينجا بودم به اين نتيجه رسيدم كه گذاشتن كد كامل درخواستي واسه دوستان با عرض معذرت باعث بدعادتي دوستان ميشه و دردسرهايي (از جمله سيل پيغامهاي خصوصي در مورد انجام پروژه هاي دانشجويي شون!) براي خودم ايجاد ميكنه : در نتيجه من يه تابع ساده واسه جمع دو تا عدد بزرگ نوشتم كه فقط واسه ايده دادن به شما بوده و سعي كردم كه تا حد امكان نزديك كد خودتون باشه و ليست پيوندي و كلاس و عملگر و ... توش نباشه؛ اميدوارم بدرد شما و دوستان ديگه بخوره و اگه مشكلي بود مشتاقم در موردش صحبت كنيم چون عجله اي نوشتم :
#define MAX_DIGITS 50
char * Add2Number( char *Number1
, int Num1Len
, char *Number2
, int Num2Len)
{
int i, MaxLen, MinLen, deficient, CarryOut = 0;
char Larger[ MAX_DIGITS ],
Smaller[ MAX_DIGITS ],
SumResult[ 2 * MAX_DIGITS ],
DigNum;
if (Num1Len > Num2Len)
{
strcpy(Larger, Number1); MaxLen=Num1Len;
strcpy(Smaller, Number2); MinLen=Num2Len;
}
else
{
strcpy(Larger, Number2); MaxLen=Num2Len;
strcpy(Smaller, Number1); MinLen=Num1Len;
}
deficient = MaxLen - MinLen;
SumResult[MaxLen] = '\0';
for (i=0; i<MaxLen; i++)
{
Larger[i] -= 48;
if (i<MinLen) Smaller[i] -=48;
}
for (i=MinLen-1; i>=0; i--)
{
SumResult[i + deficient] = Larger[i + deficient]
+ Smaller[i] + CarryOut;
CarryOut = SumResult[i + deficient] / 10;
SumResult[i + deficient] = SumResult[i + deficient] % 10;
}
SumResult[deficient - 1] = Larger[deficient - 1] + CarryOut;
for (i=0; i<deficient - 1; i++)
SumResult[i] = Larger[i];
for (int i=0; i<MaxLen; i++)
SumResult[i] += 48;
return SumResult;
}
با تشكر.
silentrise
جمعه 20 دی 1387, 17:19 عصر
سلام
من از شما سپاسگذارم که پیگیر این موصوع شدید!
1-من دانشجو نیستم و نمیتونم هم بشم!(دلیلش مهم نیست)
2-منظور از روستایی اینکه من C رو تا آرایه ها خوندم و روش های دیگه که مسلما بهتر از این همه FOR هست بلد نیستم!
من هنوز کد شما رو مطالعه نکردم پس اجاره بدین بعد از مطالعه تشکر کنم!
باسپاس
مسعود اقدسی فام
یک شنبه 22 دی 1387, 23:51 عصر
از لطف دوستان عزیز ممنونم.
هر عزیزی که در مورد بخش های مختلف کد اصلاحاتی پیشنهاد بده، من در خدمت هستم.
فکر کنم باید یه فکری هم برای بهینه سازی بیشتر ضربش بکنم. تا چه پیش آید.
باز هم تشکر. :لبخندساده:
kamkar
جمعه 18 اردیبهشت 1388, 12:33 عصر
سلام
من یه برنامه می خوام که 4 عمل اصلی رو روی اعداد بزرگ انجام بده .
اگه کسی این برنامه رو داره یه کمکی به من بکنه.
تنکی یو
Keyhan Clever
جمعه 18 اردیبهشت 1388, 14:21 عصر
منظورتون از اعداد بزرگ تا چقدره ؟
آخه هر نوع متغیری یه ظرفیتی داره.
long int هم بالا خره پر میشه چون ظرفیتش 32 بیت بیشتر نیست
ولی اگه منظورت خیلی بزرگ تر از اینهاست میتونی با آرایه ها انجام بدیش
اگه میخوای بگو یه مختصری از دستوراشو برات بنویسم
tdkhakpur
دوشنبه 21 اردیبهشت 1388, 15:15 عصر
سلام به تاپیک زیر سر بزن جوابش دادیم
ضرب و جمع دو عدد 300 رقمی؟ (http://barnamenevis.org/forum/showthread.php?t=157329&highlight=300+%D8%B1%D9%82%D9%85%DB%8C)
serojjamali
سه شنبه 22 دی 1388, 08:28 صبح
برنامش خيلي راحته
ابتدا دو رشته از ورودي ميگيري و در آرايه ذخيره مي كني
125212512541251251251225
+
1252352212512541521252125
بعد هم اعداد متناظر در آرايه رو با هم جمع مي كني
اين براي جمعه اعداده براي ضرب هم همين روش
yashar_zeus
پنج شنبه 01 بهمن 1388, 17:25 عصر
با سلام به همه دوستان من برنامه ضرب دو تا عدد 100 رقمی رو با استفاده از رشته ها و آرایه ها میخوام تو رو خدا کمکم کنید واسم حیاتیه در ضمن لیست پیوندی و کلاس هم قبول نیست
ممنون yashar_zeus@yahoo.com
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.