برای استفاده از تمام امکانات سایت از جمله مرکز دانلود باید در سایت عضو شوید. برای ثبت نام تنها 1 دقیقه زمان نیاز دارید ، برای ثبت نام اینجا کلیک کنید

صفحه اول انجمنها
ثبت نامجستجوراهنماي انجمنليست اعضااتاق چت (0)گروه هاي كاربرانمرکز دانلودورود

پاسخ به يك موضوع صفحه 3 از 3
برو به صفحه قبلي  1, 2, 3
Art Of Programming
نويسنده پيغام

پاسخ بصورت نقل قول
ارسال  
چند تابع مفيد ديگر نيز وجود دارند كه بيشتر براي كار با فايل‌ها به كار مي‌روند. آن‌ها را در بخش fstream بررسي مي‌كنيم.

 

براي كار با فايل‌ها، از كلاس‌هاي ifstream و ofstream استفاده مي‌شود كه در سر فايل <fstream> تعريف شده‌اند.

ابتدا به نحوه باز كردن يك فايل و خواندن از آن مي‌پردازيم.

براي باز كردن يك فايل ورودي، بايد يك شيء از كلاس ifstream تعريف كنيم:

 

code:
#include <fstream>

#include <iostream>

 

using namespace std;

 

void main()

{

    ifstream file("c:\\1.txt");

    if ( !file )

    {

          cout << "Error in opening file.";

          return;

    }

 

...

...

}

 

و يا

 

...

ifstream file;

file.open(filename);

if ( !file )

...

...

 

عملگر (!) براي جريان‌ها به نحوي تعريف شده است كه در صورتي كه خطايي وجود داشته باشد، مقدار true برمي‌گردانند.

وقتي يك شيء از كلاس ifstream‌ ساخته مي‌شود، به طور پيش فرض فايل ورودي در نظر گرفته مي‌شود. راه ديگر اين است كه شيءي از كلاس fstream ساخته شده و سريحاً مشخص شود كه يك فايل ورودي است:

 
code:

        fstream file;

    file.open ( filename, ios::in );


مي‌توان با تركيبي از فلگ‌هاي مشخص شده در ios ، نحوه باز شدن فايل را به صورت كامل مشخص كرد. تعدادي از اين فلگ‌ها به شرح زير است:

ios::in  – باز كردن فايل براي خواندن

ios::out – باز كردن فايل براي نوشتن در آن ( اشاره‌گر فايل در ابتداي فايل قرار مي‌گيرد و در صورت وجود فايل، عمل نوشتن، روي داده‌هاي قبلي انجام مي‌شود ).

ios::app – باز كردن فايل براي نوشتن در انتهاي آن ( اشاره‌گر فايل در انتهاي فايل قرار ميگيرد. توجه كنيد كه فايل بايد از قبل وجود داشته باشد )

ios::trunc – در صورت وجود فايل از قبل، محتويات آنرا پاك كرده و اشاره‌گر فايل را در ابتداي فايل قرار مي‌دهد.

ios::binary –  فايل را براي ورودي و خروجي binary باز مي‌كند. در صورت مشخص نكردن اين فلگ فايل به صورت متني باز مي‌شود و تمام محتويات فايل، هنگام خواند به صورت كاراكترهاي ASCII در محدوده مجاز (از 32 تا 127  به علاوه يك سري كاراكترهاي خاص مثل ‘\n’ و ‘\r’ ) در نظر گرفته مي‌شود.

اين فلگ‌ها را مي‌توان به صورت تركيبي نيز به كار برد؛ به مثال زير توجه كنيد كه فايل 1.txt را براي خواندن و نوشتن باز مي‌كند و در صورت وجود فايل از قبل، محتويات قبلي آن را پاك مي‌كند:

code:
#include <fstream>

#include <iostream>

 

using namespace std;

 

void main()

{

    fstream file;

    file.open ( "c:\\1.txt", ios::in | ios::out | ios::trunc );

    if ( !file )

    {

          cout << "Error in opnenin file." << endl;

          return;

    }

 

    file << "This is the beginnig of the file.";

    // move the file pointer back 9 characters

    file.seekg ( -9, ios::end );

    char s[20];

    file >> s;

    cout << s;

 

    file.close();

}

 

Output:

the


در اين مثال، يك متن در فايل نوشته شده‌است و سپس اشاره گر خواندن فايل، 9 كاراكتر به عقب برگردانده شده است و يك رشته از فايل خوانده شده‌است. كار تابع seekg، جابجا كردن اشاره‌گر خواندن فايل است؛ پارامتر‌هاي اين تابع به شرح زير مي‌باشد:

code:
seekg ( int offset, ios::seekdir way );


پارامتر اول، مقدار جابجايي را مشخص مي‌كند و پارامتر دوم مشخص مي‌كند كه اين مقدار از كجاي فايل در نظر كرفته شود. سه فلگ (flag يا پرچم) كه براي اين پارامتر تعريف شده‌اند به شرح زير هستند:

ios::cur
 مقدار offset از مو قعيت جاري فايل در نظر گرفته مي‌شود
 
ios::beg
 مقدار offset از ابتداي فايل در نظر گرفته مي‌شود
 
ios::end
 مقدار offset از انتهاي فايل در نظر گرفته مي‌شود
 
تابعي كه در مقابل اين تابع وجود دارد، تابع teelg() مي‌باشد كه موقعيت جاري اشاره‌گر خواندن فايل را به صورت يك عدد صحيح برمي‌گرداند.

توابع seekp و tellp نيز به همين صورت، براي كار كردن با موقعيت اشاره‌گر نوشتن در فايل به كار مي‌روند ( حرف g در tellg‌ و seekg از “get pointer” مي‌آيد و حرف p در tellp و seekp از “put pointer” مي‌آيد ).


eof() و fail() :

تابع eof()، در صورتي كه تلاش براي خواندن از انتهاي فايل صورت گيرد، مقدار true برمي‌گرداند ( eof مخخف End Of File است ). از اين تابع بايد با دقت استفاده كنيد، چرا كه اگر آخرين كاركتر فايل به طور معمول خوانده شود و اشاره‌گر فايل در انتهاي فايل قرار گيرد، اين تابع همچنان مقدار false برمي‌گرداند ؛ تنها وقتي اين تابع true برمي‌گرداند كه تلاش براي خواندن از انتهاي فايل صورت گيرد.

به مثال زير توجه كنيد تا موضوع روشن شود:

فرض كنيد در درايو C: فايلي با نام “test.txt” وجود دارد كه محتويات آن به اين صورت است:
23

45

(به يك خط خالي انتهاي فايل توجه كنيد)
فرض كنيد از كد زير براي چاپ اعداد فايل استفاده ميكنيم:

code:
#include <fstream>

#include <iostream>

 

using namespace std;

 

void main()

{

    fstream file;

    file.open ( "c:\\test.txt", ios::in );

    if ( !file )

    {

          cout << "Error in opnenin file." << endl;

          return;

    }

 

    int i;

    while ( !file.eof() )

    {

          file >> i;

          cout << i << endl;

    }

    file.close();

}

 

Output:

23

45

45

 

همنانطور كه مي‌بينيد، عدد 45 دو بار چاپ شده است. علت اين است كه بعد از اينكه عدد 45 خوانده مي‌شود، اشاره‌گر فايل روي كاراكتر انتهايي فايل قرار دارد ولي در واقع يك خط خالي براي خواند وجود دارد و تابع eof() همچنان مقدار false را برمي‌گرداند. وقتي در دور بعدي حلقه، عملگر استخراج از جريان سعي در خواندن يك عدد ديگر مي‌كند، به انتهاي فايل رسيده و پرچم eofbit در فايل set مي‌شود و مقدار متغير i نيز بدون تغيير باقي مي‌ماند. احضار بعدي تابع eof() مقدار true را در پي دارد.

براي رفع اين مشكل، بايد از تابع fail() استفاده كنيد كه مقدار پرچم failbit را برمي‌گرداند. اين پرچم در صورتي set مي‌شود كه داده‌ي معتبري از فايل خوانده نشده باشد. وقتي تابع fail() مقدار true برگرداند، به اين معني است كه عمل خواند قبلي، با موفقيت كامل انجام نشده‌است (البته اين فقط در مورد عملگر >> صدق مي‌كند؛ در مورد تابع getline قضيه اندكي فرق مي‌كند).

با اصلاح كد بالا به صورت زير، مشكل رفع مي‌شود:

code:
      while ( !file.eof() )

      {

            file >> i;

            if ( !file.fail() )

                  cout << i << endl;

      }

حال اگر فايل “c:\\test.txt” را به صورت زير تغيير دهيم:

23

45

Hello

192
 
اگر از كد اول (بدون تابع fail ) استفاده شود، عدد 45 بدون وقفه چاپ مي‌شود (امتحان كنيد) و اگر از كد اصلاح شده (با استفاده از fail) استفاده شود، برنامه بعد از چاپ 23 و 45، بدون چاپ خروجي ديگري، در يك حلقه بي انتها گير كرده و خاتمه نمي‌يابد. علت اين است كه وقتي كه عملگر >> در دور سوم حلقه سعي در خواندن عدد صحيح بعدي مي‌كند، چون به يك كاراكتر غيد عددي برخورد مي‌كند، پرچم failbit را set كرده و بدون خواندن چيزي، برمي‌گردد. چون به انتهاي فايل نيز نرسيده‌ايم، تابع eof همچنان fasle مي‌باشد. پرچم failbit نيز تا زماني كه صريحاً پاك نشود، "يك" باقي مي‌ماند. براي پاك كردن پرچم‌هاي خطا بايد از تابع clear() استفاده شود. راه حل مشكل بالا، اگر هدف فقط حذف كاراكترهاي زائد باشد، به صورت زير است:

code:
      while ( !file.eof() )

      {

            file >> i;

            if ( file.fail() )

            {

                  file.clear();

                  file.ignore ( 1000, '\n' );

            }

            else

                  cout << i << endl;

      }

براي پارامتر اول تابع ignore كه تعداد كاراكترهاست، يك مقدار بزرگ قرار داده‌ايم تا تمام كاراكتر ها را تا ابتداي خط بعدي حذف كند. توجه كنيد كه وقتي پرچم failbit مقداردهي شده باشد، هيچ تابع ديگري كار نخواهد كرد. بنابر اين قبل از هر كاري بايد آن‌را پاك كرد (به همين علت تابع clear قبل از تابع ignore قرار داده شده‌است. اگر جاي اين دو تابع عوض شود، برنامه باز هم در يك حلقه بينهايت گير مي‌كند).

عملگر (!) ، در واقع مقدار تابع fail را برمي‌گرداند. در ضمن عملگر void* نيز براي streamها طوري تعريف شده است كه مقدار معكوس تابع fail را برمي‌گرداند (يعني !fail() ) . اگر متوجه نشديد نگران نباشيد. الآن متوجه مي‌شويد! هر گاه ما نوعي را در جايي قرار دهيم كه در آنجا معني خاصي نمي‌دهد، كامپايلر سعي مي‌كند آن را به نوعي تبديل كند كه در آنجا معني بدهد! مثلاً اگر بنويسيم if ( cin ) ...; ، cin يك شرط نيست كه ما آن را در دستور if قرار دهيم؛ بنابراين كامپايلر سعي مي‌كند آن را به نوعي تبديك كند كه بتوان مقدار آن را به صورت true يا false تفسير كرد. در اين مورد، كامپايلر آن را به نوع void* تبديل مي‌كند و اين تبديل براي streamها مقدار !fail() را برمي‌گرداند. مثلاً به جاي قطعه كد بالا مي‌توانيد بنويسيد:

code:
      while ( !file.eof() )

      {

            file >> i;

            if ( file )

                  cout << i << endl;

            else

            {

                  file.clear();

                  file.ignore ( 1000, '\n' );

            }

      }



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال  
تعدادي ديگر از توابع مفيد مربوط به ورودي را در زير مي‌بينيد؛ توجه كنيد كه كلاس ifstream از istream مشتق شده است، در نتيجه، تمام توابعي كه براي istream ذكر شد، براي ifstream‌نيز به همان صورت وجود دارد. در ضمن كلاس fstream از ifstream و ofstream مشتق مي‌شود و در نتيجه، هر تابعي كه در يكي از اين دو كلاس وجود داشته باشد، در fstream نيز وجود دارد.

code:
int peek();

كاراكتر بعدي را كه قرار است خوانده شود برمي‌گرداند، بدون اينكه آن را از ورودي حذف كند. در واقع اين تابع مانند تابع get() (نوع اول) عمل مي‌كند ولي اشاره‌گر فايل را جابجا نمي‌كند.

code:
istream& unget ();

آخرين كاركتر خوانده شده را به ورودي برمي‌گردند. اين تابع موقعي كاربرد دارد كه بخواهيد آخرين عمل خواندن را لغو كنيد و كاراكتر خوانده شده را سر جايش برگردانيد.

 

code:
istream& putback ( char ch );

كاراكتر ch را به ورودي باز مي‌گرداند! در واقع اين تابع مانند تابع قبلي عمل مي‌كند ولي نكته اينجاست كه مي‌توانيد هر كاراكتري را كه خواستيد به ورودي برگردانيد؛ يعني يك كاراكتر را در يك رشته ورودي بنويسيد! مثال زير را ببينيد:

 
code:


#include <iostream>

 

using namespace std;

 

void main()

{

    char c[10], c2, c3;

 

    c2 = cin.get( );

    c3 = cin.get( );

    cin.putback( c2 );

    cin.getline( c, 10 );

    cout << c << endl;

}

 

Input:

qw

 

Output:

q


code:
istream& read ( char *str, int count );

خواندن قالب بندي نشده. از اين تابع معمولا براي خواندن از فايل‌هاي باينري استفاده مي‌شود. اين تابع، دقيقاً مقدار count بايت از ورودي خوانده (در صورت وجود) و آن را در محلي كه str به آن اشاره مي‌كند ذخيره مي‌كند. در صورتي كه قبل از خواندن cont بايت به انتهاي فايل برسد، failbit را set مي‌كند.
 

اكنون به تعدادي از توابع مربوط به خروجي مي‌پردازيم. اين توابع عضوي از كلاس ostream هستند، در نتيجه در ofstream و fstream نيز به همين شكل وجود دارند.

code:
open();

close();

eof();

fail();

clear();

tellp();

seekp();
اين توابع قبلاً توضيح داده شده‌اند و در streamهاي خروجي نيز مانند streamهاي ورودي عمل مي‌كنند (البته توابع معادل seekp و tellp، همانطور كه گفته شد، در جريان‌هاي ورودي seekg و tellg مي‌باشند).

 

code:
ofstream& put ( char ch );

كاركتر ch را (بدون قالب بندي) در خروجي مي‌نويسد. البته مي‌توانيد با استفاده از عملگر درج در جريان (<<) نيز اين كار را انجام دهيد؛ ولي تفاوت اين دو روش در همان قسمت قالب بندي است. بي خيال. حال ندارم اين يكي را توضيح بدهم!
 

code:
ostream& write ( char *str, int count );

مقدار count بايت را از آدرس str در خروجي مي‌نويسد. معمولاً براي فايل‌هاي باينري به كار مي‌رود.

 

code:
ostream& flush ();

محتويات buffer را به خروجي سرازير مي‌كند. ورودي و خروجي جرياني از سيستم ورودي و خروجي بافر شده استفاده مي‌كنند، به اين معني كه هر چيزي را كه براي خروجي ارسال مي‌كنيم، مستقيماً به صفحه نمايش يا فايل نمي‌رود، بلكه براي كارايي بيشتر، ابتدا همه چيز در يك حافظه واسط (همان buffer) قرار مي‌گيرد و وقتي به مقدار خاصي رسيد، به خروجي واقعي مي‌رود. مثلاً ممكن است بعد از اينكه سه خط را با cout براي چاپ روي صفحه نمايش ارسال كرده‌ايد، عملاً چيزي چاپ نشده باشد و بعد از cout چهارم ناگهان همه چهار خط به صفحه نمايش ارسال شوند. در مورد فايل‌ها اين مسأله خيلي مهم است و كارايي را خيلي افزايش مي‌دهد. چرا كه هد درايو هاردديسك، در هر بار عمل خواندن و نوشتن فقط مي‌تواند يك بلوك از اطلاعات (مثلاً 2048 بايت) را بخواند يا بنويسد و در ضمن خواندن از و يا نوشتن به چند بلوك پشت سر هم بسيار سريع تر از خواندن يا نوشتن بلوك‌هاي جداگانه است؛ بنابراين، وقتي داده‌ها را براي نوشتن در فايل ارسال مي‌كنيد، تا زماني كه به اندازه يك يا چند بلوك نشوند به ديسك ارسال نمي‌شوند.

برنامه زير را در نظر بگيريد:

code:
#include <iostream>

#include <conio.h>

 

using namespace std;

 

void main()

{

    cout << "Hello\n";

    cout << "Press any key to exit ..." << endl;

    getch();

}

ممكن است قبل از اجراي دستور getch()، خروجي به صفحه نمايش نرفته و بدون اينكه كاربر چيزي ببيند دستور getch() اجرا شود. براي جلوگيري از اين مسأله، بايد cout را وادار كنيم كه خروجي را نمايش دهد:

code:
      cout << "Hello\n";

      cout << "Press any key to exit ..." << endl;

      cout.flush();

      getch();



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال فصل ششم 
تو این فصل از کتاب در مورد روش های الگوریتم ها مثل موارد زیر صحبت کرده:

1) بهینه سازی و حذف کردن حالات تکراری

2) روش های بازگشتی ساده ( مثل فاکتوریل ) و چند شاخه ( مثل هانوی )

3) فیلتر کردن ( 8 وزیر ) و استفاده از توابع یاد آور ( استفاده از اعداد اول )

این رو درباره روش تقسیم و حل داده :

code:
DC(P) {
if small(P) then
return Solve(P);
else {
divide P into smaller instances P1,...,Pk, k>1;
Apply DC to each of these subproblems;
return combine(DC(P1),...,DC(Pk));
}
}


دیگه زیاد چیزه به درد بخوری نداره  Razz


_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال فصل هفتم : ریاضیات 
اگه بخوایم فصل 7 رو شروع کنیم همون اول 3 تا سوال در مورد مبناها تو کتاب معرفی کرده :

code:
Solve UVa problems related with base conversion:
343 - What Base Is This?
353 - The Bases Are Loaded
389 - Basically Speaking


اولی رو حل کردم , فردا پس فردا کدش رو میزارم . دومی رو پیدا نکردم . سومی هم باشه واسه بعد .


_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال  
می تونید از این لینک برای سوال ها استفاده کنین :

http://acm.uva.es/problemset

اون پایین سوال ها رو با توجه به شماره شون طبقه بندی کرده.


_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال  
این کد آقای مهدی قارداشپوره واسه این سوال 343 UVA
code:
//uva#343 what base is this?
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
#include <cmath>
#include <cstdio>
#include <fstream>

using namespace std;

map <char,int> mapChar2Int;

inline int Calc_Base(string & _N , int & _Base)  //12  (3)  = 5 (10)
{
       int retVal = 0 , power=0 , dig =0;

       for(int i=_N.size()-1; i>=0; i--)
       {
               char chDig = _N[i];
               if(chDig>='0' && chDig<='9')
                       dig = chDig - '0';
               else
                       dig = mapChar2Int[chDig];

               retVal += dig * (int)(pow((float)_Base , power++));
       }

       return retVal;
}


int main()
{
       string X , Y;
       ifstream cin("test.in");

       //Chars to Int values :
       for(char ch='0'; ch<='9'; ch++)
               mapChar2Int[ch] = ch - '0';
       for(char ch='A'; ch<='Z'; ch++)
               mapChar2Int[ch] = ch - 'A' + 10;


       //
       while(cin >> X >> Y)
       {
               char maxDigX = '0' , maxDigY = '0';
               bool flag= false;
               int XBaseResult =0, YBaseResult =0,baseX =1 ,baseY=1;

               for(size_t i=0; i<X.size(); i++)        //finding Max digit in X :
                       if(X[i] > maxDigX)
                               maxDigX = X[i];

               for(size_t i=0; i<Y.size(); i++)        //finding Max digit in Y :
                       if(Y[i] > maxDigY)
                               maxDigY = Y[i];

               maxDigX = mapChar2Int[maxDigX];         //2 int value :
               maxDigY = mapChar2Int[maxDigY];         //

               // *** :
               for(baseX = maxDigX +1; baseX<=36; baseX++)
               {
                       if(baseX<=1)
                               baseX =2;

                       XBaseResult = Calc_Base(X , baseX);
                       for(baseY = maxDigY+1; baseY<=36; baseY++)
                       {
                               if(baseY<=1)
                                       baseY =2;
                               YBaseResult = Calc_Base(Y , baseY);
                               if(XBaseResult == YBaseResult)
                               {
                                       flag = true;
                                       break;
                               }
                       }

                       if(flag)
                               break;
               }

               (flag) ? cout << X << " (base " << baseX << ") = " << Y << " (base " << baseY << ")\n" : cout << X << " is not equal to " << Y << " in any base 2..36\n" ;
       }
       return 0;
}



_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال  
راستش از این UVA خوشم نیومد . حالا حل کردن سوال ها باشه واسه بعدا" . ادامه میدیم :
این فرمول رو واسه حساب کردن باقیمونده a*b*c  بر n داده :

A*B*C) mod N == ((A mod N) * (B mod N) * (C mod N)) mod N)

به این درد می خوره که اگه A*B*C خیلی بزرگ شد . بیایم تک تک باقیمونده ها رو حساب کنبم بعد در هم ضزب کنیم.

این هم مثال :
code:

(7*11*23) mod 5 is 1; let's see the calculations step by step:
((7 mod 5) * (11 mod 5) * (23 mod 5)) Mod 5 =
((2 * 1 * 3) Mod 5) =
(6 Mod 5) = 1

این هم کدیه که میاد باقیمونده ی b به توان p رو بر m به همین روش حساب می کنه . ولی اگه سوال 347 UVA رو با همین کد بنویسی time limit می خوری !!!

code:

long bigmod(long b,long p,long m) {
if (p == 0)
return 1;
else if (p%2 == 0)
return square(bigmod(b,p/2,m)) % m; // square(x) = x * x
else
return ((b % m) * bigmod(b,p-1,m)) % m;
{


کسی کی دونه اون سوال  رو چی حوری باید حل کرد ؟


_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال Carmichael Number 
همین قد فهمیدم :

عددی که square free باشه و بیش ( مساوی ) سه تا مقسوم علیه اول داشته باشه.

اولین اعداد Carmichael این هان : 561,1105,1729,2465,2821,6601,8911,10585,15841

عددی رو میگن square free که هیچ مقسوم علیه ای نداشته باشه که مجذور کامل باشه. ( غیر از 1 )

یه نکته جالب هم برای اعداد اول فهمیدم :

یه راه برای تشخیص اول بودن عدد n :

اگر a عددی تصادفی بین 2 و n-1 باشه و رابطه ی( a^n mod n == a ) برای جندین a بر قرار باشه به احتمال زیاد n یک عدد اوله.

اگه این پست مشکلی داشت یا کسی سوالی داره بگه.


_________________
آگه 50000 نفر هم به یک چیز اشتباه اعتقاد داشته باشن , اون چیز هنوز هم اشتباه است !

محمـــــــــــــــــــــدرضا . اگر گه گاهی سراغتون افتاد , خوشحال میشم : http://360.yahoo.com/molla652003

سوابق کاریه من :

معاد
روزی یک حدیث
ACM_sharif
طراحی الگوریتم
در اعماق بی کران
Art Of Programming
عکس های بچه ها
نماز
معرفی سایت های مفید
شعر های دوران مهدکودک
موفقیت
موسیقی

پاسخ بصورت نقل قول
ارسال  
محاسبه فاكتوريل اعداد بزرگ با كمك رشته ها ( حتي دقيق تر از ماشين حساب ويندوز!!!)
code:

#include<stdio.h>
#include<string.h>
char f[10000];
char factorial[1010][10000];
void multiply(int k)
{
   int cin,sum,i;
   int len = strlen(f);
   cin=0;
   i=0;
   while(i<len)
   {
      sum=cin+(f[i] - '0') * k;
      f[i] = (sum % 10) + '0';
      i++;
      cin = sum/10;
   }
   while(cin>0)
   {
      f[i++] = (cin%10) + '0';
      cin/=10;
   }
   f[i]='\0';
   for(int j=0;j<i;j++)
   factorial[k][j]=f[j];
   factorial[k][i]='\0';
}
void fac(){
   int k;
   strcpy(f,"1");
   for(k=2;k<=1000;k++)
   multiply(k);
}
void print(int n)
{
   int i;
   int len = strlen(factorial[n]);
   printf("%d!\n",n);
   for(i=len-1;i>=0;i--)
   {
      printf("%c",factorial[n][i]);
   }
   printf("\n");
}
int main()
{
   int n;
   factorial[0][0]='1';
   factorial[1][0]='1';
   fac();
   while(scanf("%d",&n)==1)
   {
      print(n);
   }
   return 0;
}


نمايش نامه هاي ارسال شده قبلي:
پاسخ به يك موضوع صفحه 3 از 3
برو به صفحه قبلي  1, 2, 3