2015-06-28 24 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; 
} 
相关问题