Извлечение цифр из целого числа без sprintf () или по модулю - PullRequest
2 голосов
/ 21 января 2010

Требования этого являются несколько ограничительными из-за механизма, на котором это в конечном итоге будет реализовано (графический процессор).

У меня есть целое число без знака, и я пытаюсь извлечь каждую отдельную цифру.

Если бы я делал это в C ++ на обычном оборудовании и производительность не была большой проблемой, я мог бы сделать это так:

(не ненавидите меня за этот код, это просто пример, иллюстрирующий метод)

#define _CRT_SECURE_NO_WARNINGS

#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int someVal = 1234;

    char stringVal[256] ={0};
    sprintf(stringVal, "%016d", someVal);

    int digits[16] = {0};
    for( int i = 0; i < strlen(stringVal); ++i )
    {
        digits[i] = stringVal[i] - '0';
    }

    cout << "Integer Value = " << someVal << endl;
    cout << "Extracted Digits = ";
    copy( &digits[0], &digits[16], ostream_iterator<int>(cout, "-") );
    cout << endl;

    return 0;
}

Я пытаюсь найти способ извлечь эти цифры со следующими ограничениями:

  1. Не преобразовывать целое число в строку
  2. Не используйте оператор модуля (деление с плавающей запятой нормально)
  3. Рассматриваемое значение представляет собой 32-разрядное целое число без знака

Я ищу алгоритм, не обязательно конкретный код. Но конкретный код был бы великолепен. Языки, с которыми я хорошо знаком, которые хорошо подходят для моего целевого оборудования, - это C ++, C и ассемблер.

Есть идеи?

РЕДАКТИРОВАТЬ: Вот обновление с алгоритмом, который я реализовал на основе комментариев и ссылок ниже. Спасибо всем.

#define _CRT_SECURE_NO_WARNINGS

#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int main()
{
    unsigned someVal = 12345678;
    static const unsigned numDigits = 10;
    unsigned digits[numDigits] = {0};

    for( unsigned i = 0, temp = someVal; i < numDigits; ++i, temp /= 10 )
    {
        digits[numDigits-i-1] = temp - 10 * (temp/10)      /*temp % 10*/;
    }


    cout << "Integer Value = " << someVal << endl;
    cout << "Extracted Digits = ";
    copy( &digits[0], &digits[numDigits], ostream_iterator<int>(cout, "-") );
    cout << endl;

    return 0;
}

Ответы [ 3 ]

7 голосов
/ 21 января 2010

Помните, что оператор по модулю на самом деле может быть реализован как:

mod(a, n) = a - n * floor(a / n)

Следовательно, вы можете использовать ваш любимый алгоритм на основе модуля. Вы можете смоделировать сам пол путем типирования.

1 голос
/ 21 января 2010

Стоит задуматься , Терье Матизен.

1 голос
/ 21 января 2010

Посмотрите вокруг здесь во фрагментах Боба Стаута здесь, в Архиве C, и здесь в Архиве C ++. Не единственный, что архив фрагментов стремится быть переносимым.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...