целое число в строку - PullRequest
       39

целое число в строку

0 голосов
/ 28 октября 2011

Библиотека strutils.h содержит функцию IntegerToString. (Вы могли бы знать, как компьютер фактически выполняет процесс преобразования целого числа в его строковое представление.)

Как оказалось, самый простой способ реализовать эту функцию - использовать рекурсивное разложение целого числа.

Кто-то написал рекурсивную реализацию IntegerToString, чтобы он работал рекурсивно, не используя какие-либо итеративные конструкции, такие как while и for.

Хотя это помогло мне ... я не могу понять код: S

#include <iostream>
#include <string>

using namespace std;

const char digit_pairs[201] = {
  "00010203040506070809"
  "10111213141516171819"
  "20212223242526272829"
  "30313233343536373839"
  "40414243444546474849"
  "50515253545556575859"
  "60616263646566676869"
  "70717273747576777879"
  "80818283848586878889"
  "90919293949596979899"
};


std::string& itostr(int n, std::string& s)
{
    if(n==0)
    {
        s="0";
        return s;
    }

    int sign = -(n<0);
    unsigned int val = (n^sign)-sign;

    int size;
    if(val>=10000)
    {
        if(val>=10000000)
        {
            if(val>=1000000000)
                size=10;
            else if(val>=100000000)
                size=9;
            else 
                size=8;
        }
        else
        {
            if(val>=1000000)
                size=7;
            else if(val>=100000)
                size=6;
            else
                size=5;
        }
    }
    else 
    {
        if(val>=100)
        {
            if(val>=1000)
                size=4;
            else
                size=3;
        }
        else
        {
            if(val>=10)
                size=2;
            else
                size=1;
        }
    }
    size -= sign;
    s.resize(size);
    char* c = &s[0];
    if(sign)
        *c='-';

    c += size-1;
    while(val>=100)
    {
       int pos = val % 100;
       val /= 100;
       *(short*)(c-1)=*(short*)(digit_pairs+2*pos); 
       c-=2;
    }
    while(val>0)
    {
        *c--='0' + (val % 10);
        val /= 10;
    }
    return s;
}

просто хочу лучше понять этот код.

1 Ответ

3 голосов
/ 28 октября 2011

Я думаю, что "рекурсивное разложение" -

N = T * 10 + O

Это приводит к рекурсивному алгоритму

string(N) = let T = idiv(N, 10),
            let O = mod(N, 10),
            concat(T? string(T): empty_string, todigit(O))

Теперь вам просто нужно написать это на C ++, разбираясь с небольшими деталями.

Тогда, если вы хотите увидеть более эффективные способы, прочитайте

...