将整数分成非后向数字

时间:2015-06-28 21:35:40

标签: c++

我正在寻找一种将整数分成数字的有效而简单的方法,但我需要从第一个开始将它们分开。

以下是将数字分成数字的典型方法:

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 - &gt; 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:我不能使用堆栈,列表或那种结构。

提前致谢

4 个答案:

答案 0 :(得分:1)

您也可以使用一些字符串方法。例如,您可以将您的数字转换为字符串。因此,您可以使用字符串拆分函数。 当然你可以使用下面的示例代码

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

答案 1 :(得分:0)

解决方案可以是递归:

int index=0, result[100];

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

(但它会使用隐式堆栈)

答案 2 :(得分: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;
}

答案 3 :(得分:0)

我想我会将 int 转换为字符串,遍历每个 char 并将其转换回 int < / strong>,同时将新创建的 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;
}