1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

ترفندهای++C برای برنامه نویسی رقابتی

شروع موضوع توسط MoeinTN ‏30/12/17 در انجمن C #C++

  1. داره خودمونی میشه!

    تاریخ عضویت:
    ‏5/10/17
    ارسال ها:
    52
    تشکر شده:
    15
    امتیاز دستاورد:
    8
    جنسیت:
    مرد
    اگرچه تمرین تنها راهی است که باعث افزایش عملکرد در امر برنامه نویسی میشود اما دانستن ترفند هم در عیب یابی سریع مؤثر است.

    1)تشخیص این که یک عدد فرد است یا زوج؛بدون استفاده از اپراتور %:
    این ترفند خیلی بهتر از استفاده از اپراتور% نیست اما برخی اوقات کاربردی است(در استفاده از اعداد بزرگ).

    Example:
    num = 5
    Binary: “101 & 1” will be 001, so true
    num = 4
    Binary: “100 & 1” will be 000, so false.

    if (num & 1)

    cout << "ODD";

    else

    cout << "EVEN";

    2)اعمال ضرب و تقسیم سریع توسط 2:
    ضرب کردن توسط 2 به معنی تغییر مکان تمام بیت ها به سمت چپ است و تقسیم توسط 2 به معنی تغییر مکان به سمت راست است.مثال:2(بایناری10):تغییر مکان 4به چپ(بایناری 100) و تغییر مکان 1 به راست(بایناری 1)

    n = n << 1; // Multiply n with 2

    n = n >> 1; // Divide n by 2

    3)جابجایی اعداد 2 با استفاده از XOR:
    این روش سریع است و نیازمند استفاده از متغیر سوم نیست.

    // A quick way to swap a and b

    a ^= b;

    b ^= a;

    a ^= b;

    4)خودداری استفاده از strlen() :
    // Use of strlen() can be avoided by:

    for (i=0; s; i++)

    {

    }

    // loop breaks when the character array ends.

    5)استفاده از emplace_back() :
    بجای push_back() در STL emplace_back میتواند مورد استفاده قرار بگیرد چون سریع تر است و بجای توزیع حافظه در جای دیگر و سپس افزودن آن به طور مستقیم در محفظه.

    6)قابلیت های درونی GCD:
    C++ قابلیت درونی GCD دارد و احتیاجی به کد کردن مستقیم ندارد.

    Syntax: _gcd(x, y);

    7)استفاده از قابلیت های درون خطی:
    ما میتوانیم قابلیت های درون خطی ایجاد کنیم و از آن ها بدون نیاز به کدنویسی استفاده کنیم.مثال:قابلیت (a) برای غربالگری،قابلیت(b) برای تقارن استفاده میشود.

    8)بیشترین اندازه ی آرایه:
    ما باید بدانیم که بیشترین سایز آرایه بیانگر درون قابلیت اصلی از ترتیب 6^10 است،اما اگر شما آرایه را به صورت کلی نشان دهید میتوانید اندازه اش را تا 7^10 بیان کنید.

    9)محاسبه ی مهم ترین رقم:
    برای محاسبه ی مهم ترین رقم،لوگ میتواند به صورت مستقیم برای محاسبه ی آن به کار برود.


    Suppose the number is N then

    Let double K = log10(N);

    now K = K - floor(K);

    int X = pow(10, K);

    X will be the most significant digit.


    10)محاسبه ی تعداد ارقام به صورت مستقیم:
    برای محاسبه ی تعداد ارقام ،به جای لوپ کردن میتوانید از لوگ استفاده کنید:

    Number of digits in N =floor(log10(N)) + 1;

    11)ترفندی کاربردی برای فهمیدن این که یک عدد به توان 2 است:
    با استفاده از تکنیک معمولی تقسیم،قسمت دشوار O(logN) است،اما میتواند با استفاده از O(v) جایی که v تعداد ارقام یک عدد در فرم بایناری است،حل بشود.

    /* Function to check if x is power of 2*/

    bool isPowerOfTwo (int x)

    {

    /* First x in the below expression is

    for the case when x is 0 */

    return x && (!(x&(x-1)));

    12)C++11 الگوریتم های داخلی برای موارد زیر دارد:
    // are all of the elements positive?

    all_of(first, first+n, ispositive());


    // is there at least one positive element?

    any_of(first, first+n, ispositive());


    // are none of the elements positive?

    none_of(first, first+n, ispositive());

    13)کپی الگوریتم،به منظور کپی کردن عناصر از یک محفظه به محفظه ی دیگر:
    int source[5] = {0, 12, 34, 50, 80};

    int target[5];

    // copy 5 elements from source to target

    copy_n(source, 5, target);

    14)الگوریتم Iota:
    الگوریتم iota() محدوده ای از مقادیری که به ترتیب زیاد میشوند را ایجاد میکند،این کار با استفاده از قرار دادن مقدار اولیه ی *first و سپس گسترش آن مقدار با استفاده از پیشوند++ انجام میگیرد.در لیست پایین،iota() مقادیر متوالی {10,11,12,13,14} را به آرایه ی arr و {a’,b’,c’} را به آرایه ی c[] الصاق میکند.

    int a[5] = {0};

    char c[3] = {0};


    // changes a to {10, 11, 12, 13, 14}

    iota(a, a+5, 10);

    iota(c, c+3, 'a'); // {'a', 'b', 'c'}

    15)مقداردهی اولیه ی در فرم بایناری:
    در C++11 افزودنی ها میتوانند در فرم بایناری ساخته بشوند.

    // C++ code to demonstrate working of

    // "binary" numbers

    #include<iostream>

    using namespace std;

    int main()

    {

    auto number = 0b011;

    cout << number;

    return 0;

    }

    برروی IDE اجرا کنید

    خروجی:

    3

    16)استفاده از "and" :
    با عدم وجود یک مورد کاربردی از آن،این نکته به شما کمک میکند که تنها از اپراتور شرطی and به جای تایپ & استفاده کنید.

    // C++ code to demonstrate working of "and"

    #include<iostream>

    using namespace std;

    int main()

    {

    int a = 10;

    if (a < 20 and a > 5)

    cout << "Yes";

    return 0;

    }

    برروی IDE اجرا کنید

    خروجی:

    Yes

    منابع: 118فایل
    mug