2010-01-20 40 views
2

由於最終將在GPU上實現的機器的要求有限制。從一個整數中提取數字沒有sprintf()或Modulo

我有一個無符號整數,我試圖提取每個單獨的數字。

如果我在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; 
} 
+0

你可以'地板'任何產生的花車? – 2010-01-20 21:54:56

+0

@Anon。 :不知道,讓我做一個小小的研究... – 2010-01-20 21:55:33

+0

@約翰:你*可以* typecast然而 – 2010-01-20 21:57:09

回答

7

記住模運算符居然實現:

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

因此,您可以使用自己喜歡的模基於算法。你可以通過類型轉換模擬地板本身。

+0

+1甜!沒想到這一點。 – 2010-01-20 22:03:41

+1

+1。這是我用我的'floor'評論得到的。 – 2010-01-20 22:04:18

1

查看Bob Stout在C Archive下的代碼片段here,以及C++ Archive下的here。並不是唯一的片段存檔力爭是可移植的。

希望這會有所幫助, 最好的問候, 湯姆。

+0

+1:在那裏還沒有發現任何具體的問題,但鏈接的大道具。看起來像很多非常酷的東西在那裏。 – 2010-01-20 22:08:43

+0

另外,看看這裏http://forum.codecall.net/c-c/6083-extracting-singel-digits-int。html看算法 – t0mm13b 2010-01-20 22:08:55

+0

非常好,再次感謝。 – 2010-01-20 22:18:00

相關問題