سؤال

أحاول تحويل عدد صحيح إلى سلسلة في الوقت الحالي ، وأواجه مشكلة.

لقد حصلت على الكود المكتوب والعمل في معظم الأحيان ، ولكن لديه عيب صغير عند حمله إلى المكان التالي. من الصعب وصفها ، لذلك سأعطيك مثالاً. باستخدام قاعدة 26 مع مجموعة أحرف تتكون من الأبجدية الصغيرة:

0 = "أ"
1 = "ب"
2 = "C"

...

25 = "Z"
26 = "BA" (يجب أن يساوي "AA")

يبدو أن تخطي الحرف في مكان الصفر في الحرف المحدد في مواقف معينة.

الشيء الذي يربكني هو أنني لا أرى أي خطأ في الكود الخاص بي. لقد كنت أعمل على هذا لفترة طويلة الآن ، وما زلت لا أستطيع معرفة ذلك.

char* charset = (char*)"abcdefghijklmnopqrstuvwxyz";
int charsetLength = strlen(charset);

unsigned long long num = 5678; // Some random number, it doesn't matter
std::string key

do
{
    unsigned int remainder = (num % charsetLength);
    num /= charsetLength;

    key.insert(key.begin(), charset[remainder]);

} while(num);

لدي شعور بأن الوظيفة تتجه فوق Modulo التي تعيد صفرًا ، لكنني كنت أعمل على ذلك لفترة طويلة ، لا يمكنني معرفة كيفية حدوثها. أي اقتراحات مرحب بها.

تحرير: حقيقة أن السلسلة التي تم إنشاؤها هي Little Endian ليست ذات صلة بتطبيقي.

هل كانت مفيدة؟

المحلول

إذا فهمت بشكل صحيح ما تريده (الترقيم المستخدمة من قبل Excel للأعمدة ، A ، B ، .. Z ، AA ، AB ، ...) هذا تدوين قائم على تمثيل الأرقام بدءًا من 1. الأرقام الـ 26 لها قيم 1 ، 2 ، ... 26 والقاعدة 26. لذا فإن القيمة 1 ، القيمة z 26 ، القيمة AA 27 ... حساب هذا التمثيل يشبه إلى حد كبير إعادة التثبيت العادي الذي تحتاجه فقط لضبط الإزاحة 1 بدلا من 0.

#include <string>
#include <iostream>
#include <climits>

std::string base26(unsigned long v)
{
    char const digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    size_t const base = sizeof(digits) - 1;
    char result[sizeof(unsigned long)*CHAR_BIT + 1];
    char* current = result + sizeof(result);
    *--current = '\0';

    while (v != 0) {
        v--;
        *--current = digits[v % base];
        v /= base;
    }
    return current;
}

// for testing
#include <cstdlib>

int main(int argc, char* argv[])
{
    for (int i = 1; i < argc; ++i) {
        unsigned long value = std::strtol(argv[i], 0, 0);
        std::cout << value << " = " << base26(value) << '\n';
    }
    return 0;
}

الجري مع 1 2 26 27 52 53 676 677 702 703 يعطي

1 = A
2 = B
26 = Z
27 = AA
52 = AZ
53 = BA
676 = YZ
677 = ZA
702 = ZZ
703 = AAA

نصائح أخرى

مشكلتك هي أن "a" == 0.

بمعنى آخر ، "AA" ليس هو الحل ، لأن هذا هو 00 حقًا.

رمزك صحيح ، يبدو أنك فقط سوء فهمه.

أعتقد أنك يجب أن تصنع = 1 و z = 0 لذا لديك ABC ... Z كما هو الحال في عشري 1234 ... 90

قارنه بالنظام العشري: 9 يتبعه 10 وليس بحلول 01!

للحصول على حل Aprogrammers للتجميع على نظامي (أنا أستخدم الإصدار 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) كنت بحاجة لإضافة رؤوس ؛#include <climits> #include<cstdlib>

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top