从没有 sprintf() 或模的整数中提取数字

Posted

技术标签:

【中文标题】从没有 sprintf() 或模的整数中提取数字【英文标题】:Extract Digits From An Integer Without sprintf() Or Modulo 【发布时间】:2010-01-20 21:51:33 【问题描述】:

由于最终将在(GPU)上实现的机器,此要求有些限制。

我有一个无符号整数,我正在尝试提取每个单独的数字。

如果我在普通硬件上使用 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;

我正在尝试找到一种方法来提取这些数字,但有以下限制:

    不要将整数转换为字符串 不要使用模运算符(浮点除​​法很好) 有问题的值是一个 32 位无符号整数

我正在寻找一种算法,不一定是特定的代码。但是具体的代码会很棒。我最熟悉的可以很好地转换为我的目标硬件的语言是 C++、C 和汇编程序。

有什么想法吗?

编辑:这是我根据下面的 cmets 和链接实现的算法的更新。谢谢大家。

#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;

【问题讨论】:

你能floor 任何结果浮动吗? @Anon。 : 不确定,让我对此进行一些研究...... @John:你可以进行类型转换 @Anon & Kornel Kisielewicz:浮点地板和天花板都很好,整数和浮点之间的转换也是如此。 Integer floor & ceil 有点不清楚,但由于 i-f 转换很便宜,我可以这样。 只是好奇,为什么要避开% 【参考方案1】:

请记住,取模运算符实际上可以实现为:

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

因此,您可以使用自己喜欢的基于模的算法。您可以通过类型转换来模拟地板本身。

【讨论】:

【参考方案2】:

在 Bob Stout 的 sn-ps 中查看 C 档案下的 here 和 C++ 档案下的 here。不仅 sn-ps 存档力求可移植。

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

+1:还没有找到任何具体到我的问题的东西,但是链接的大道具。看起来里面有很多很酷的东西。 另外,看这里forum.codecall.net/c-c/6083-extracting-singel-digits-int.html查看算法【参考方案3】:

One worth considering,作者 Terje Mathisen。

【讨论】:

以上是关于从没有 sprintf() 或模的整数中提取数字的主要内容,如果未能解决你的问题,请参考以下文章

从没有空格的字符串中读取整数

如何从没有数字主键的表中有效地选择随机行

C语言sprintf与sscanf函数[总结]

C语言sprintf与sscanf函数[总结]

C语言sprintf与sscanf函数[总结]

从字符串S中提取每个位置的整数[重复]