2015-06-28 25 views
2

我正在尋找一種高效且簡單的方法將整數分隔爲數字,但我需要從第一個開始將它們分開。將整數分成非數字的位數

下面是sepparate一個數字,數字的典型方式:

int main(int argc, char* argv[]) { //argc is going to be the number 
    while(argc != 0) { 
     cout << argc % 10 << endl; 
     argc /= 10; 
    } 

    return 0; 
} 

但是做這種方式,我會得到,例如,5437 - > 7,3,4,5 我想扭轉上訴順序,5,4,3,7。所以我創造了這個:

int main(int argc, char* argv[]) { 
    int rem = 1; 

    while(argc/rem > 10) //We increase the remainder until we get the same amount of digits than the number 
     rem *= 10; 

    while(argc != 0) { 
     cout << argc/rem << endl; //We take the cocient of the division, wich will be always the first digit 
     argc %= rem; //Now we discard that digit 
     rem /= 10; //And we decrease the number of digits of the remainder too 
    } 

    return 0; 
} 

事情是:是否有任何其他方式以較短/更簡單的方式做到這一點?

PS:我不能使用堆棧,列表或那種結構。

在此先感謝

+2

遞歸是另一種方式。 –

+1

我通常只有一個數組存儲,然後將其向前打印。 –

+0

我無法想象不得不限制自己使用堆棧或列表,除非彙編語言是真正的目標。在6502中有各種各樣的小技巧可以使用。在缺少本地分割指令的多臺機器中,存在一種涉及三位移位的技巧,並根據何時添加來添加3或6。 6的意義在於它當然是10和16之間的差別。穆罕默德的答案看起來就像你應該使用的答案,即使「技術上」數組是一個堆棧。 –

回答

1

您也可以使用一些字符串方法。對於比如,你可以你的電話號碼轉換爲字符串.Therefor,您可以使用字符串分路器功能。當然 您可以使用下面的示例代碼

#define MaxDigits 8 

void SplitDigits(int Number, int* DigitArray) 
{ 
    for(int i=(MaxDigits-1); i>=0; i++) 
    { 
     DigitArray[i] = Number % 10; 
     Number /= 10; 
    } 
} 

int main() 
{ 
    int DigitArray[MaxDigits]; 
    int Number = 1538; 

    SplitDigits(Number, DigitArray); 

    for(int i=0; i<MaxDigits; i++) 
    { 
     cout << DigitArray[i] << endl; 
    } 

    return 0; 
} 
0

一個解決辦法是遞歸:

int index=0, result[100]; 

void digits(int x) { 
    if (x > 10) digits(x/10); 
    result[index++] = x % 10; 
} 

(它將但使用隱式堆棧)

0
unsigned n = 123450; 
unsigned m = 0, k = 1; 
while (n != 0) { 
    m = m * 10 + n % 10; 
    n /= 10; 
    k++; 
} 
while (--k > 0) { 
    cout << m % 10 << endl; 
    m /= 10; 
} 
+0

這是一個不正確的方法,因爲你不會得到尾隨零。例如,對於數字10,您將得到1而不是1和0。 –

+0

@VladfromMoscow好點,謝謝!糾正。 – AlexD

0

我想我會將int轉換爲字符串,通過每個char並將其轉換回int,同時將該新創建的int存儲在載體中。這可能比它要複雜得多,但我覺得它更容易。主要是因爲我已經制作了將數字轉換爲字符串的功能,反之亦然。我相信這不是一個有效的方法,但它的工作原理。

下面是我只是做了它(注意,這可以在一個單一的函數來完成):

// convert an int to a string representation 
string intToString(const int& digit) 
{ 
    ostringstream oss; 
    oss << digit; 
    return oss.str(); 
} 

// if possible, convert characters in string to integer value 
int stringToInt(const string& str) 
{ 
    istringstream iss{ str }; 
    int digit; 
    iss >> digit; 
    if (!iss) 
     throw runtime_error{ "integer format error: " + str}; 
    return digit; 
} 

// split an int into its seperate digits and store them in a vector 
vector<int> splitInteger(const int& digit) 
{ 
    vector<int> splits;  // holds the ints that are split from the original 
    const string s = intToString(digit); 
    for (char ch : s) { 
     const string temp{ ch }; // convert char to string for use with stringToInt() 
     splits.push_back(stringToInt(temp)); 
    } 
    return splits; 
} 

您可能還需要命名的東西比我更好,如果你走這條路線。我很快在命名事物上很糟糕。 :)

所以這裏是一個使用splitInteger的簡單方法():

int main() 
{ 
    cout << "Enter an integer: "; 
    int num; 
    cin >> num; 
    vector<int> splits = splitInteger(num); 

    for (const int& i : splits) 
     cout << i << '\n'; 

    system("pause"); 
    return 0; 
} 
相關問題