簡體   English   中英

在該變量上執行操作時,有哪些方法可以在C ++中用更少的編譯時間在變量中存儲很大的整數值?

[英]What are various methods to store very large integer value in a variable with less compilation time in C++ when doing operation on that variable

我應該如何處理此變量以使其在不下載任何新庫的情況下存儲大量變量。我正在談論使用某種操作(例如哈希或數組)或我不知道的東西。

如果您不需要對該變量執行任何操作並且不能使用任何庫,包括C ++標准庫,請使用

const char* x = "1119191991900234245239919234772376189636415308431";

否則,下一個最好的東西是

std::string x = "1119191991900234245239919234772376189636415308431";

甚至可以對這種編碼執行基本算術,字符串中位置n的數字值為x[n] - '0'


但這一切確實很愚蠢。 建議您查看Boost發行版中的大數字庫。 見www.boost.org。

為了好玩,我寫了一些只適用於字符串的東西。 順便說一句,您給的數字非常大,大約是我們的太陽系質量(以千克為單位)的五百億倍。

有兩種方法。 第一個將數字加一個,然后檢查它是否是回文。 這是一個較慢的版本,但仍可以在合理的時間內處理大約16位數字。

第二種方法是更好的方法,它基本上將數字的左側復制到右側,這幾乎是即時的。 由於現在是代碼,因此您可以同時運行它們以交叉引用結果。

我不能說它是萬無一失的,並且我肯定其中有錯誤,但是它似乎可行,並且編寫它確實很有趣。 另外,如果不允許使用任何庫,則重構非常容易,只需使用原始字符串並在函數中傳遞大小即可。

#include <iostream>
#include <string>
#include <chrono>
#include <stdexcept>
#include <cstring>

using namespace std::chrono;
using namespace std;

auto startT = high_resolution_clock::now();
auto endT = high_resolution_clock::now();
double timeTaken;

#define STARTCLOCK startT = high_resolution_clock::now();
#define STOPCLOCK endT = high_resolution_clock::now();
#define PRINT_ELAPSED_TIME timeTaken = duration_cast<milliseconds>(endT - startT).count() / 1000.0; \
                            cout << "Process took " << timeTaken << " seconds\n\n";


void addOneTo(std::string& value)
{
    int64_t idx = value.size();

    do 
    {
        --idx;
        if (idx < 0) {
            memset(&value[0], '0', value.size());
            value.insert(value.begin(), '1');
            return;
        }
        value[idx] += char(1);
        if (value[idx] > '9') { value[idx] = '0'; }

    } while (value[idx] == '0');
}

bool isPalindrome(const std::string& number)
{
    const char* start = &number[0];
    const char* end = &number[number.size() - 1];

    while (start <= end)
    {
        if (*start != *end) return false;
        ++start;
        --end;
    }
    return true;
}

std::string getSmallestPalindromeByBruteForceBiggerThan(std::string num)
{
    if (num.empty()) throw std::runtime_error("Empty string");

    while (true)
    {
        addOneTo(num);
        if (isPalindrome(num)) return num;
    }
}


std::string getSmallestPalindromeOptimisedWayBiggerThan(std::string num)
{
    if (num.empty()) throw std::runtime_error("Empty string");

    addOneTo(num);
    if (num.size() == 1) return num;
    int64_t left;
    int64_t right;

    left = num.size() / 2 - 1;

    if (num.size() % 2 == 0)  right = num.size() / 2; 
    else right = num.size() / 2 + 1;

    if (num[left] < num[right])
    {
        ++num[left];
        num[right] = num[left];
    }

    for (; left >= 0 && right < num.size(); --left, ++right)
    {
        num[right] = num[left];
    }

    return num;
}

int main()
{
    string number = "60819750046451377";

    STARTCLOCK
    string palindrome = getSmallestPalindromeByBruteForceBiggerThan(number);

    cout << "____BRUTE FORCE____\n";
    cout << "Smallest palindrome = \n" << palindrome << '\n';

    STOPCLOCK
    PRINT_ELAPSED_TIME

    STARTCLOCK

    palindrome = getSmallestPalindromeOptimisedWayBiggerThan(number);

    cout << "____OPTIMISED____\n";
    cout << "Smallest palindrome = \n" << palindrome << '\n';

    STOPCLOCK
    PRINT_ELAPSED_TIME

    cin.ignore();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM